我遇到了以下错误:
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对我不起作用。
答案 0 :(得分:4)
答案在这里找到: 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了解如何操作说明 启用了这个。
答案 1 :(得分:2)
您发布的例外说明了问题所在:
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)
)。
<强>加强>
尝试按merge
save
答案 2 :(得分:0)
我不确定它是否与您的问题有关,但请注意merge()
的错误用法。
merge()
不会使传递给它的对象持久化,而是返回另一个具有相同状态的实例,所以你应该写
bean.setManufacturer(s.merge(bean.getManufacturer()));
答案 3 :(得分:0)
有时真正的错误在于其他地方。要检查确切的错误,请使用Debug模式并使用printstacktrace()方法进行异常。它为您提供了更详细的原因。在我的情况下,我使用了String,其中列的类型为int。