2012-07-19 83 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