休眠:org.hibernate.AssertionFailure:com.xxx.Bean 条目中的空 id

Posted

技术标签:

【中文标题】休眠:org.hibernate.AssertionFailure:com.xxx.Bean 条目中的空 id【英文标题】:Hibernate: org.hibernate.AssertionFailure: null id in com.xxx.Bean entry 【发布时间】:2011-07-03 10:25:03 【问题描述】:

我遇到了以下错误:

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 的情况下避免此错误?

This solution 不幸地对我不起作用。

【问题讨论】:

org.hibernate.AssertionFailure: null id in com.xxx.Bean entry (don't flush the Session after an exception occurs) - 必须有第二个(更有趣的)(断言)异常 - 请也发布它 答案已更新 - (抱歉,我忽略了相关部分) 【参考方案1】:

答案在这里找到: 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 获取说明如何 启用此功能。

【讨论】:

【参考方案2】:

您发布的异常说明了问题所在:

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

在 Hibernate 中,您必须在 Session 相关的异常发生后丢弃 Hibernate Session。

但我想这不是你的问题。

您需要设置Bean 的ID 或改用&lt;generator class="native" /&gt; (@GeneratedValue(strategy=GenerationType.AUTO))。

已添加 尝试用save替换:merge

【讨论】:

其实我之前已经尝试过了。我发现问题是由&lt;many-to-one column="ARF_MANUFACTURER_MNF_ID"引起的,而不是由主键引起的。 所以你可能有两个问题。但是你是对的,你描述的行为看起来你没有设置ManufacturerBean,所以你需要设置它,或者删除你的forain key字段的Not Null约束。 神秘的是我已经设置了它并且它不是null,但是hibernate会抛出AssertionError :) @Antonio:看来您需要检查 SQL 语句,这可能会给您一个提示。 (我希望你先坚持 ManuacturingBean) 安东尼奥:尝试用save替换:merge【参考方案3】:

我不确定这是否与您的问题有关,但请注意merge()的错误用法。

merge() 不会使传递给它的对象持久化,而是返回另一个具有相同状态的实例,所以你应该写

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

【讨论】:

感谢您的建议!我试过了,但也没有用。【参考方案4】:

有时真正的错误在于其他地方。要检查确切的错误,请使用调试模式并使用 printstacktrace() 异常方法。它为您提供了更详细的原因。在我的例子中,我使用了 String,其中列的类型为 int。

【讨论】:

以上是关于休眠:org.hibernate.AssertionFailure:com.xxx.Bean 条目中的空 id的主要内容,如果未能解决你的问题,请参考以下文章

vmware黑群晖硬盘休眠

休眠文件瘦身教程 Win10休眠文件怎么清

linux系统关闭休眠命令

惠普电脑休眠怎么唤醒

使用注解或使用休眠配置文件休眠

win10怎么把电脑休眠文件