簡體   English   中英

Hibernate:org.hibernate.AssertionFailure:com.xxx.Bean條目中的null id

[英]Hibernate: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry

我遇到了以下錯誤:

com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract void com.xxx.Service.save(com.xxx.Bean)' threw an unexpected exception: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)
    at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    at com.xxx.ServiceImpl.save(ServiceImpl.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    ... 23 more

這是MySQL表定義:

CREATE TABLE `tblARF` (
  `ARF_ID` bigint(19) NOT NULL AUTO_INCREMENT,
  `ARF_MANUFACTURER_MNF_ID` bigint(19) NOT NULL,
  ...
  PRIMARY KEY (`ARF_ID`),
  KEY `ARF_MANUFACTURER_MNF_ID` (`ARF_MANUFACTURER_MNF_ID`)
)

這是Hibernate映射:

<class name="Bean" table="tblARF">
  <id name="key" type="long" unsaved-value="null">
    <column name="ARF_ID" not-null="true"/>
    <generator class="identity" />
  </id>
<many-to-one column="ARF_MANUFACTURER_MNF_ID" name="manufacturer"
    class="ManufacturerBean" not-null="true" lazy="false"/>
...
</class>

Java代碼:

Session s = hibernate.getCurrentSession();
Transaction t = s.beginTransaction();
s.merge(bean.getManufacturer());
s.save(bean);
t.commit();

我注意到如果我刪除了KEY ARF_MANUFACTURER_MNF_ID (ARF_MANUFACTURER_MNF_ID) ,那么AssertionFailure就不會發生。 有沒有辦法避免這個錯誤而不刪除KEY?

不幸的是, 這個解決方案對我不起作用。

答案在這里找到: https//forum.hibernate.org/viewtopic.php?f = 1&t = 1009141

'order'是SQL中的保留關鍵字,因此如果要將if用作列名,則需要引用它。 有關如何啟用此功能的說明,請參閱http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-quotedidentifiers

您發布的例外情況說明了問題所在:

Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)

在Hibernate中,您必須在發生與會話相關的異常后丟棄Hibernate會話。

但我想這不是你的問題。

您需要設置Bean的ID或使用<generator class="native" /> (@ @GeneratedValue(strategy=GenerationType.AUTO) )。

添加嘗試替換:通過save merge

有時真正的錯誤在於其他地方。 要檢查確切的錯誤,請使用Debug模式並使用printstacktrace()方法進行異常。 它為您提供了更詳細的原因。 在我的情況下,我使用了String,其中列的類型為int。

我不確定它是否與您的問題有關,但請注意merge()的錯誤用法。

merge()不會使傳遞給它的對象持久化,而是返回另一個具有相同狀態的實例,所以你應該寫

bean.setManufacturer(s.merge(bean.getManufacturer())); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM