[英]Hibernate: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry
I was faced to the following error: 我遇到了以下错误:
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
Here is MySQL table definition: 这是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`)
)
And here is Hibernate mapping: 这是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 code: Java代码:
Session s = hibernate.getCurrentSession();
Transaction t = s.beginTransaction();
s.merge(bean.getManufacturer());
s.save(bean);
t.commit();
I noticed that if I remove KEY ARF_MANUFACTURER_MNF_ID (ARF_MANUFACTURER_MNF_ID)
than AssertionFailure
doesn't happen. 我注意到如果我删除了
KEY ARF_MANUFACTURER_MNF_ID (ARF_MANUFACTURER_MNF_ID)
,那么AssertionFailure
就不会发生。 Is there a way to avoid this error without removing the KEY? 有没有办法避免这个错误而不删除KEY?
This solution doesn't work for me unfortunately. 不幸的是, 这个解决方案对我不起作用。
The answer was found here: https://forum.hibernate.org/viewtopic.php?f=1&t=1009141 答案在这里找到: https : //forum.hibernate.org/viewtopic.php?f = 1&t = 1009141
'order' is a reserved keyword in SQL so if you want to use if as a column name it needs to be quoted.
'order'是SQL中的保留关键字,因此如果要将if用作列名,则需要引用它。 See http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-quotedidentifiers for instructions how to enabled this.
有关如何启用此功能的说明,请参阅http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-quotedidentifiers 。
The Exception you have posted said what the problem is: 您发布的例外情况说明了问题所在:
Caused by: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs)
In Hibernate you have to throw away the Hibernate Session after a Session related Exception occures. 在Hibernate中,您必须在发生与会话相关的异常后丢弃Hibernate会话。
But I guess that is not your question. 但我想这不是你的问题。
You need to set the ID of your Bean
or use <generator class="native" />
( @GeneratedValue(strategy=GenerationType.AUTO)
) instead. 您需要设置
Bean
的ID或使用<generator class="native" />
(@ @GeneratedValue(strategy=GenerationType.AUTO)
)。
Added try to replace: merge
by save
添加尝试替换:通过
save
merge
Sometimes the real error lies somewhere else. 有时真正的错误在于其他地方。 To check the exact error use Debug mode and make use of printstacktrace() method of exception.
要检查确切的错误,请使用Debug模式并使用printstacktrace()方法进行异常。 It gives you the more detailed reason.
它为您提供了更详细的原因。 In my case I had used String where the column was of type int.
在我的情况下,我使用了String,其中列的类型为int。
I'm not sure whether it's related to your problem, but note the wrong usage of merge()
. 我不确定它是否与您的问题有关,但请注意
merge()
的错误用法。
merge()
doesn't make the object passed into it persistent, it returns another instance with the same state instead, so you should write merge()
不会使传递给它的对象持久化,而是返回另一个具有相同状态的实例,所以你应该写
bean.setManufacturer(s.merge(bean.getManufacturer()));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.