简体   繁体   English

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

[英]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.

相关问题 org.hibernate.AssertionFailure: null 标识符@OneToOne 关系 - org.hibernate.AssertionFailure: null identifier @OneToOne relationship Spring JPA/Hibernate org.hibernate.AssertionFailure: null id in Entity(异常发生后不刷新Session) - Spring JPA/Hibernate org.hibernate.AssertionFailure: null id in Entity (don't flush the Session after an exception occurs) Spring JPA 共享主键导致 org.hibernate.AssertionFailure: null identifier - Spring JPA Shared primary key causes org.hibernate.AssertionFailure: null identifier org.hibernate.AssertionFailure:可能对会话进行非线程安全的访问 - org.hibernate.AssertionFailure: possible non-threadsafe access to the session org.hibernate.AssertionFailure 获取序列值时的问题 - org.hibernate.AssertionFailure Issue when getting sequence value org.hibernate.AssertionFailure:集合被flush()处理了两次 - org.hibernate.AssertionFailure: collection was processed twice by flush() org.hibernate.criteria.uniqueResult期间的AssertionFailure - org.hibernate.AssertionFailure during criteria.uniqueResult Hibernate AssertionFailure:条目中的id为null(发生异常后不要刷新Session) - Hibernate AssertionFailure: null id in entry (don't flush the Session after an exception occurs) AssertionFailure:当Hibernate查询对象时,有时会抛出null id - AssertionFailure: null id sometimes thrown when Hibernate query objects Hibernate 断言失败 - Hibernate AssertionFailure
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM