object references an unsaved transient instance异常处理

本文记录了在开发邮箱系统过程中遇到的Hibernate TransientObjectException异常,并详细介绍了如何定位问题及最终的解决办法。

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

在开发邮箱系统时遇到了这样的问题,
后台报了object references an unsaved transient instance的异常,
我马上检查代码,却找不到问题所在,于是google了一下,搜到了很多结果,
但是所有的答案基本上是映射的问题,我也修改试了,结果是行不通。
应该是别人的解决方案给了我一些提示,最后我解决了这个问题。

异常信息

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: net.bolue.oa.vo.BlOaMailFolder
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:456)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:264)
at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:295)
at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:3403)
at org.hibernate.event.def.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:520)
at org.hibernate.event.def.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:230)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:154)
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 org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy18.deleteBlOaMailBox(Unknown Source)
at net.bolue.oa.action.BlOaMailAction.absoluteDeleteReceive(BlOaMailAction.java:139)
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)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:269)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at net.bolue.util.AccessFilter.doFilter(AccessFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
at java.lang.Thread.run(Thread.java:619)



BlOaMailBox实体类


private String bombId; //自动编码
private String bomId; //邮件ID
private long userid; //邮件所属用户Id
private Integer bombType; //邮件保存类型
private Long bomfId; //所属文件夹Id
private Integer bombState; //是否垃圾
private Integer bombRead; //是否已读

private BlOaMail bm; //所属邮件
private BlOaMailFolder bmf; //所属文件夹
private BlBasicUser blBasicUser; //所属用户



关系映射

<hibernate-mapping>
<class name="net.bolue.oa.vo.BlOaMailBox" table="bl_oa_mail_box">
<id name="bombId" type="java.lang.String">
<column name="BOMB_ID" length="32" />
<generator class="assigned" />
</id>
<property name="bomId" type="java.lang.String">
<column name="BOM_ID" length="32" not-null="true" />
</property>
<property name="userid" type="java.lang.Long">
<column name="USERID" not-null="true" />
</property>
<property name="bombType" type="java.lang.Integer">
<column name="BOMB_TYPE" not-null="true">
<comment>1为收件,0为发件</comment>
</column>
</property>
<property name="bomfId" type="java.lang.Long">
<column name="BOMF_ID" />
</property>
<property name="bombState" type="java.lang.Integer">
<column name="BOMB_STATE">
<comment>1为是,0为否</comment>
</column>
</property>
<property name="bombRead" type="java.lang.Integer">
<column name="BOMB_READ" />
</property>

<many-to-one class="net.bolue.oa.vo.BlOaMail" column="BOM_ID"
lazy="false" name="bm" outer-join="true" insert="false" update="false"/>
<many-to-one class="net.bolue.oa.vo.BlOaMailFolder" column="BOMF_ID"
lazy="false" name="bmf" outer-join="true" insert="false" update="false"/>
<many-to-one class="net.bolue.basic.vo.BlBasicUser" column="USERID"
lazy="false" name="blBasicUser" outer-join="true" insert="false" update="false"/>
</class>
</hibernate-mapping>


dao实现

Object[] object = (Object[])list.get(0);
blOaMailBox = new BlOaMailBox();
BlOaMail bm = new BlOaMail();
BlOaMailFolder bmf = null;
BlBasicUser bbu = new BlBasicUser();
BlBasicUser sender = new BlBasicUser();
blOaMailBox.setBombId((String)object[0]);
blOaMailBox.setUserid((Long)object[1]);
blOaMailBox.setBombType((Integer)object[2]);
blOaMailBox.setBombState((Integer)object[3]);
blOaMailBox.setBombRead((Integer)object[4]);
bm.setBomId((String)object[5]);
bm.setBomTopic((String)object[6]);
bm.setUserid((Long)object[7]);
bm.setBomRecList((String)object[8]);
bm.setBomCopyList((String)object[9]);
bm.setBomSecList((String)object[10]);
bm.setBomTime((Date)object[11]);
bm.setBomState((Integer)object[12]);
bm.setBomContent((String)object[13]);
if(object[14]!=null){
bmf = new BlOaMailFolder();
bmf.setBomfId((Long)object[14]);
bmf.setBomfName((String)object[15]);
}
blOaMailBox.setBomId(bm.getBomId());
String userIdStr = String.valueOf(blOaMailBox.getUserid());
bbu.setUserId(Integer.parseInt(userIdStr));
bbu.setUserName((String)object[16]);
bbu.setUserAccount((String)object[17]);
String senderIdStr = String.valueOf(bm.getUserid());
sender.setUserId(Integer.parseInt(senderIdStr));
sender.setUserName((String)object[18]);
sender.setUserAccount((String)object[19]);
bm.setSender(sender);
blOaMailBox.setBm(bm);
blOaMailBox.setBmf(bmf);
blOaMailBox.setBlBasicUser(bbu);


最关键的是4和21到25行
如果4行转换为下面的代码就会出错,因为文件夹可以为空,当查找出BlOaMailBox对象
而这个对象里的BlOaMailFolder对象肯定存在,但里面的值却可能为空,在对这个BlOaMailBox对象做一些操作时,比如删除,就会出现上面的异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值