hibernate的一个问题:object references an unsaved transient instance - save the transient instance before

dengjie532054105 2009-04-24 10:08:53
我就是做了一对多和多对一的双向关联,我关联查询的时候会报错。这个异常我搜过的。但是还是没有解决问题。异常如下:
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - rollback
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - re-enabling autocommit
21:57:42.218 [http-8080-1] DEBUG o.h.transaction.JDBCTransaction - rolled back JDBC Connection
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
21:57:42.218 [http-8080-1] DEBUG org.hibernate.impl.SessionImpl - disconnecting session
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
21:57:42.218 [http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources!
2009-4-24 21:57:42 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet xiaoyuBlog threw exception
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.blog.blog.domain.User
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:242)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:430)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:110)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1728)
at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1699)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1589)
at org.hibernate.loader.Loader.doQuery(Loader.java:696)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)

下面是我的HBM配置:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="org.blog.blog.domain">
<class name="Article" table="article" dynamic-update="true" >

<id name="id">
<generator class="native"/>
</id>
<property name="title" column="TITLE"/>
<property name="content" column="CONTENT"/>
<property name="createDate" column="CREATE_DATE"></property>
<many-to-one name="createUser" class="User">
<column name="user_id" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>
下一个是:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
package="org.blog.blog.domain">
<class name="User" table="user" dynamic-update="true" >
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="NAME"/>
<property name="password" column="PASSWORD"/>
<property name="email" column="EMAIL"></property>
<property name="phone" column="PHONE"></property>
<bag name="articles" table="article" inverse="true" lazy="false" cascade="all">
<key column="user_id"/>
<one-to-many class="Article" />
</bag>
</class>
</hibernate-mapping>

我配置的文件,我WEB层调用的方法是:
User user=(User)request.getSession().getAttribute("user");
List<Article> articles=articleManager.findByProperty("createUser", user);
我提供了getter和setter方法的。但是总报这个错误。在这个地方也报:
User user=(User)request.getSession().getAttribute("user");
article.setCreateUser(user);
article.setCreateDate(new Date());
articleManager.save(article);
我很想彻底解决这个问题,它的意思就是麽有把对象持久,user对象没有持久就保存。
...全文
14106 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
meishi112233 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
这个问题的原因是在双向多对一关系中,就比如student和teacher。在保存student时候你没有先保存teacher,这样hibernate在执行save方法时会发现你的setTeacher(teacher)里面teacher是空值因而报异常。网上有的做法是将级联擦做cascade设置为all。你可以试试。
[/Quote]
如果是你这样比方的话。。我的teacher表里有值。我想给student加数据 写级联以后 他又会去多生成一个新的teacher。。。
笑料 2012-08-06
  • 打赏
  • 举报
回复

如果又不想级联删除,怎么办哇

好吧,可以用hibernate的Cascade
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
...
@Cascade({CascadeType.SAVE_UPDATE})
佐罗斯 2012-06-14
  • 打赏
  • 举报
回复
14楼正解,谢谢
bjchenchen 2012-06-13
  • 打赏
  • 举报
回复
这问题也遇到好几次,但每次都稀里糊涂的过去了。

这次的问题纠结了我一个多小时,数据是从jsp传过来的,然后进行创建。这个时候就报错。

后来经过debug调试后,反正挺费精神的。发现页面传过来的对象(obj)中,有个外键对象应该是null,但它确不是null,而是个空对象,这样我最后create(obj)时,报出此错误。郁闷至极。。。
zhongxiazhiye 2012-06-01
  • 打赏
  • 举报
回复
我今天晚上也遇到这个问题,是在个人信息修改时出错的,看了很多这样子的解答,但是还是不行。但是后来我解决了

原来我获取不到角色ID,用户的信息修改时就报错。我就在角色的dao层里面写个根据角色名称来获取角色列表的方法,即roleService.findByRname(rname),这样角色ID就可以像下面这样获取到了。
int rid = roleService.findByRname(rname).get(0).getRid();
然后再把该ID用set给role
即role.setRid(rid);
运行,就OK了
huannanchunli 2012-04-24
  • 打赏
  • 举报
回复
求解啊
PriSuka 2012-03-16
  • 打赏
  • 举报
回复
这个问题的原因是在双向多对一关系中,就比如student和teacher。在保存student时候你没有先保存teacher,这样hibernate在执行save方法时会发现你的setTeacher(teacher)里面teacher是空值因而报异常。网上有的做法是将级联擦做cascade设置为all。你可以试试。
yangcmao 2011-12-30
  • 打赏
  • 举报
回复
我也是啊:org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: net.demo.entiry.RoomType
雨泽 2011-11-09
  • 打赏
  • 举报
回复
我的问题也是一样的啊,纠结啊
es:

object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization
object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization

File: org/hibernate/engine/ForeignKeys.java
Line number: 243
Stacktraces
org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.yy.entity.Orgnization

org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:654)
org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy14.save(Unknown Source)
com.yy.action.OrgAction.save(OrgAction.java:101)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
super2007 2011-10-15
  • 打赏
  • 举报
回复
我也遇到这样的问题 求结贴
mcload 2011-09-19
  • 打赏
  • 举报
回复
我也遇到这个问题了,不知道如何解决
yczyh364 2011-07-30
  • 打赏
  • 举报
回复
我也遇到了
tannytao 2011-07-20
  • 打赏
  • 举报
回复
我也遇到了。。头大啊。。
qiebeiji 2011-07-13
  • 打赏
  • 举报
回复
同样遇到了这个问题
zsdst 2011-01-25
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
woshigou_cool 2009-05-26
  • 打赏
  • 举报
回复
把cascade属性修改为"save-update"
HSSASJ 2009-04-25
  • 打赏
  • 举报
回复
你看看你的需要持久化的对象User是否实现接口:Serializable没有!如果没有!那可能就会出现这个问题了!
Study_Work_2009 2009-04-25
  • 打赏
  • 举报
回复
你的配置有问题,可能是实体类跟字段有冲突
dengjie532054105 2009-04-25
  • 打赏
  • 举报
回复
还有个问题就是,我用spring mvc的表单,比如说在编辑中,我需要在进入编辑页面控制器中把article存入session中,那么提交控制器方法,就应该取到ID,这样可以再提交控制器得到相同的ID对象的article可以进行动态更新,但是却得不到id,代码如下:
/**
* 进入编辑文章控制器
* @return
*/
@RequestMapping(value="/system/editArticle.do",method=RequestMethod.GET)
public String setEditArticle(Long articleId,ModelMap model){
Article articleEdit=articleManager.get(articleId);
model.addAttribute("articleEdit", articleEdit);
return "editArticle";
}

/**
* 提交编辑文章控制器
* @return
*/
@RequestMapping(value="/system/editArticle.do",method=RequestMethod.POST)
public String editArticle(@ModelAttribute Article articleEdit,ModelMap model,SessionStatus status){

articleEdit.setCreateDate(new Date());
articleManager.update(articleEdit);
status.setComplete();
return "redirect:/system/index.do";
}

做了annotation的配置的:@SessionAttributes("articleEdit")
dengjie532054105 2009-04-25
  • 打赏
  • 举报
回复
实体类和字段有冲突?是什么意思?是名称写错了?是不是<bag name="articles" table="article" inverse="true" lazy="false" cascade="all">
<key column="user_id"/>
<one-to-many class="Article" />
</bag>
我建立的SQL语句:
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`TITLE` varchar(255) DEFAULT NULL,
`CONTENT` varchar(255) DEFAULT NULL,
`CREATE_DATE` datetime DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `FKD458CCF6617371DA` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#
# Dumping data for table article
#
/*!40000 ALTER TABLE `article` DISABLE KEYS */;

/*!40000 ALTER TABLE `article` ENABLE KEYS */;

#
# Table structure for table user
#
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(20) DEFAULT NULL,
`PASSWORD` varchar(20) DEFAULT NULL,
`EMAIL` varchar(255) DEFAULT NULL,
`PHONE` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧