2012-07-19 82 views
0

由于复杂的原因,我在我的数据库中定义了一个视图,并且我希望hibernate能够读取此视图,所以我将它映射为它就像是一个常规表。这一切似乎在生产中工作正常。休眠试图更新视图

现在我正在运行一个测试,它炸毁了。我打开了休眠显示sql和sql注释,这里是我发现的:

Hibernate: /* FROM PostponeDateLimit WHERE postponeDate>=? AND postponeDate <=? AND controlCode = ? ORDER BY postponeDate ASC */ select postponeda0_.REQUEST_DATE as REQUEST1_5_, postponeda0_.COURTLOCATION as COURTLOC2_5_, postponeda0_.ALLOWED as ALLOWED5_, postponeda0_.POSTPONED as POSTPONED5_, postponeda0_.DATECAP as DATECAP5_ from POSTPONE_DATE_VIEW postponeda0_ where postponeda0_.REQUEST_DATE>=? and postponeda0_.REQUEST_DATE<=? and postponeda0_.COURTLOCATION=? order by postponeda0_.REQUEST_DATE ASC  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=?  
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=? 
Hibernate: /* update com.acs.gs.juror.pojo.PostponeDateLimit */ update POSTPONE_DATE_VIEW set ALLOWED=?, POSTPONED=?, DATECAP=? where REQUEST_DATE=? and COURTLOCATION=? 
2012-07-18 16:07:44,503 35529 WARN org.hibernate.util.JDBCExceptionReporter | SQL Error: 4406, SQLState: S1000 
2012-07-18 16:07:44,503 35529 ERROR org.hibernate.util.JDBCExceptionReporter | Update or insert of view or function 'EJUROR_POSTPONE_DATE_VIEW' failed because it contains a derived or constant field. 

因此更新视图导致异常。

只有第一个查询是由我发起的。出于某种奇怪的原因,更新似乎是由hibernate创建的。我不能为我的生活弄清楚为什么它是在我的本地测试盒上,而不是在我们的活盒上。

这里是我的Hibernate映射:

<class name="com.pojo.PostponeDateLimit" table="POSTPONE_DATE_VIEW"> 
    <composite-id class="com.acs.gs.juror.pojo.PostponeDateLimitKey" mapped="true"> 
     <key-property name="postponeDate" type="calendar" column="REQUEST_DATE"/> 
     <key-property name="controlCode" column="COURTLOCATION"/> 
    </composite-id> 
    <property name="maxCount" column="ALLOWED"/> 
    <property name="postponedCount" column="POSTPONED"/> 
    <property name="dateCap" column="DATECAP"/> 
</class> 

有谁见识呢?

+0

你可以运行你的测试调试吗?如果是这样,请在SQLException上设置断点异常,并且您将能够看到发生了什么以及为什么发布这些更新。 – Luciano 2012-07-19 11:56:46

+0

@Luciano我正在寻找我的版本的hibernate源代码。 – Thom 2012-07-19 12:01:33

回答

0

你可以做实体只读按照Hibernate documents

在这种情况下,可能最好使com.pojo.PostponeDateLimit类不可改变的。这也将捕获任何代码帽子试图改变数据 - 我怀疑是发生了什么事,而不是Hibernate做什么

+0

看来你必须在会话中设置一些东西才能做到这一点?如果是这样,我如何与Spring做到这一点? – Thom 2012-07-19 12:01:58

+0

最终在映射文件中的类定义上放置了mutable =“false”。这似乎修复了它。顺便说一下,在hibernate文档中没有找到。 :( – Thom 2012-07-19 12:06:46

+0

现在,有谁知道为什么hibernate觉得有必要更新数据库中的这些行吗? – Thom 2012-07-19 12:07:15