SSH+Oracle問題:org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch upda

來源:互聯網
上載者:User

在進行SSH整合開發過程中,自己遇到了一個問題,花了近一天時間才解決掉。

首先,頁面報的錯誤為:

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

 

在控制台中,報錯為:

java.lang.IllegalStateException<br />at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)<br />at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)<br />at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)<br />at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)<br />at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)<br />at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)<br />at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)<br />at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)<br />at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)<br />at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)<br />at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)<br />at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)<br />at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)<br />at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)<br />at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)<br />at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)<br />at java.lang.Thread.run(Unknown Source) 

 

1.對於頁面上的錯誤

原因:資料庫表中設定了關聯關係,但是在插入資料的時候沒有設定關聯關係,插入的時候就會報錯
改正:設定對錶之間的關聯關係就可以了

 

2.控制台的錯誤

出錯了,我們一般都是看控制台,但這個錯誤與真正的錯誤去無關,具體原因,可以GOOGLE  or BAIDU 一下

 

資料庫中有一張表採用聯合主鍵形式,其一一個鍵又是外鍵

 

具體原因還是出錯還是在於問題1,在設計Oracle資料時候,我們對自動標識id同時設定了Trigger和Sequence。但對於hibernate來說,在插入資料之前會先運行一次Sequence產生id的,所以這時如果還有觸發器(TRIGGER),又要再運行一次Sequence,於是就會發現id是以2為步進增加的。這時把Trigger刪除,步進就為1了。

 

實體類的主鍵配置策略如下:

<id name="id" type="java.lang.Integer"><br /><column name="ID" /><br /><generator class="sequence"><br /><param name="sequence">TEMP_VEHICLE_DATA_SEQS</param><br /></generator><br /></id>

 

下面為hibernate處理代碼:

 getHibernateTemplate().setFlushMode(0);<br />getHibernateTemplate().execute(new HibernateCallback() {<br />public Object doInHibernate(Session session)<br />throws HibernateException, SQLException {<br />session.connection().setAutoCommit(false);<br />Set<TempMtItem> tempMtItem = list.get(0).getTempMtItems();<br />for (TempMtItem mt : tempMtItem) {<br />session.save(mt);<br />for (Object lan : mt.getTempMtItemLanguages()) {<br />TempMtItemLanguage tempLan = (TempMtItemLanguage) lan;<br />TempMtItemLanguageId id = new TempMtItemLanguageId();<br />id.setItemId(mt.getId());<br />id.setLngCde(tempLan.getLanguage());<br />tempLan.setId(id);<br />session.save(tempLan);<br />}<br />}<br />for (TempVehicleData temp : list)<br />session.save(temp);<br />session.flush();<br />session.connection().commit();<br />return null;<br />}<br />});<br />getHibernateTemplate().setFlushMode(1);

在調用session.save()或者getHibernateTemplate().save()方法時會自動產生根據sequence把查詢到的id號set給這個對象的id
 

 附幾篇文章連結:

http://www.blogjava.net/caixuetao/archive/2007/04/26/113433.html

http://www.cnblogs.com/xuwenyan/archive/2008/02/18/1072795.html

http://www.cppblog.com/jerryma/archive/2010/03/10/109334.aspx

http://coldandhot.blog.hexun.com/11958153_d.html

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.