hibernate 常见的几个问题(二)

本文探讨了在使用Spring框架和Hibernate ORM时遇到的TransientObjectException异常,详细解析了异常产生的原因,即尝试更新持久化对象时引用了一个未保存的瞬态对象。文章最后给出了正确的解决方案,强调了在更新关联对象时应当从数据库获取已存在的实体。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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属性允许为空,就不用这样写了,直接去掉就好了)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值