读书人

hibernate 常见的几个小问题(二)

发布时间: 2012-10-12 10:17:04 作者: rapoo

hibernate 常见的几个问题(二)

org.hibernate.TransientObjectException: entity.User

exception???
?
javax.servlet.ServletException: org.springframework.dao.InvalidDataAccessApiUsageException: entity.User; nested exception is org.hibernate.TransientObjectException: entity.User??
??? org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)??
??? org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)??
??? org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)??
??? org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)??
??? org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:637)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:717)??
??? web.tools.UTF8.doFilter(UTF8.java:16)??
?
?
root cause???
?
org.springframework.dao.InvalidDataAccessApiUsageException: entity.User; nested exception is org.hibernate.TransientObjectException: entity.User??
??? org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:634)??
??? org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:714)??
??? org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:583)??
??? org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)??
??? org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)??
??? org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)??
??? org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)??
??? org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)??
??? org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)??
??? org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)??
??? org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)??
??? $Proxy4.addGoods(Unknown Source)??
??? web.action.GoodsAction.doAdd(GoodsAction.java:107)??
??? sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)??
??? sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)??
??? sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)??
??? java.lang.reflect.Method.invoke(Method.java:597)??
??? org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)??
??? org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)??
??? org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)??
??? org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)??
??? org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)??
??? org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)??
??? org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:637)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:717)??
??? web.tools.UTF8.doFilter(UTF8.java:16)??
?
?
root cause???
?
org.hibernate.TransientObjectException: entity.User??
??? org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)??
??? org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)??
??? org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:221)??
??? org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:476)??
??? org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:2803)??
??? org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:467)??
??? org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:190)??
??? org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)??
??? org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)??
??? org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)??
??? org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)??
??? org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)??
??? org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)??
??? org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)??
??? org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:575)??
??? org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)??
??? org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)??
??? org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)??
??? org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)??
??? org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)??
??? org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)??
??? org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)??
??? org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)??
??? $Proxy4.addGoods(Unknown Source)??
??? web.action.GoodsAction.doAdd(GoodsAction.java:107)??
??? sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)??
??? sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)??
??? sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)??
??? java.lang.reflect.Method.invoke(Method.java:597)??
??? org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)??
??? org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)??
??? org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)??
??? org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)??
??? org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)??
??? org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)??
??? org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:637)??
??? javax.servlet.http.HttpServlet.service(HttpServlet.java:717)??
??? web.tools.UTF8.doFilter(UTF8.java:16)?
exception

javax.servlet.ServletException: org.springframework.dao.InvalidDataAccessApiUsageException: entity.User; nested exception is org.hibernate.TransientObjectException: entity.User
?org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
?org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
?org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
?org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
?org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
?web.tools.UTF8.doFilter(UTF8.java:16)


root cause

org.springframework.dao.InvalidDataAccessApiUsageException: entity.User; nested exception is org.hibernate.TransientObjectException: entity.User
?org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:634)
?org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:714)
?org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:583)
?org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
?org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
?org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
?org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
?org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
?org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
?org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
?org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
?$Proxy4.addGoods(Unknown Source)
?web.action.GoodsAction.doAdd(GoodsAction.java:107)
?sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
?java.lang.reflect.Method.invoke(Method.java:597)
?org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
?org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
?org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
?org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
?org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
?org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
?org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
?web.tools.UTF8.doFilter(UTF8.java:16)


root cause

org.hibernate.TransientObjectException: entity.User
?org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:216)
?org.hibernate.type.EntityType.getIdentifier(EntityType.java:108)
?org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:221)
?org.hibernate.type.TypeFactory.findDirty(TypeFactory.java:476)
?org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:2803)
?org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:467)
?org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:190)
?org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:113)
?org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
?org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
?org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
?org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
?org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
?org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
?org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:575)
?org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:662)
?org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
?org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:314)
?org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:117)
?org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
?org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
?org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
?org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
?$Proxy4.addGoods(Unknown Source)
?web.action.GoodsAction.doAdd(GoodsAction.java:107)
?sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
?sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
?sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
?java.lang.reflect.Method.invoke(Method.java:597)
?org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)
?org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)
?org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:106)
?org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
?org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
?org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
?org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
?javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
?web.tools.UTF8.doFilter(UTF8.java:16)

?

这个错误让我郁闷了好一段时间,现在终于搞懂了是什么缘故了!!!

update item之前 执行了item.setUserByBuyerId(new User()),此时的item是persistent状态,而userByBuyerId属性是一个transient状态的对象,并且cascade为默认的"none"(如果是all那么会试图创建一个新的User对象),所以无法更新item。

<--都是 spring 的 formbackingObject 惹的麻烦,害我debuge了好长时间,希望大家不要再范类似错误了。-->

解决方案:从数据库中获取entity.User实例,而不能用new。

说明下,我的Good FormBean中有两个属性是用到User的Id这个外键的,所以在改造Good FormBean构造方法时,如果有一个属性允许为空,则不能用new创建这个实例(列:item.setUserBySalerId(new User()),若userBySalerId属性允许为空,就不用这样写了,直接去掉就好了)

(总之:更新从表时,主表的主键必须有值)

读书人网 >软件架构设计

热点推荐