struts+hibernate 遇到这样的问题,无法解决,求助!

ELement_DG 2008-10-04 12:06:53
2008-10-04 11:54:55 delete failed
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [com.po.TblHouse#24]


遇到这样的问题,没遇到这样的问题以前,我是新手!

事情是这样的:
需要删除一条记录,我没有手动编写删除方法,由Hibernate自己生成了delete()方法,我就用了这个方法,可是却跳出了上面的异常,不知道怎么解决!


求助!!!!!
...全文
165 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liguangwen86 2008-10-23
  • 打赏
  • 举报
回复
可以在拦截器里关闭session;并且每次执行一定要关闭,不然的话会造成服务器挂机!
ELement_DG 2008-10-22
  • 打赏
  • 举报
回复
谢谢各位 已经解决问题,可是解决得方法令我很郁闷,在Hibernate生成的DAO方法中,每一个方法最后都手动关闭session


public void save(...){
........
}finally{
getSession().close();
}



这好像是版本问题!
月夜雪 2008-10-08
  • 打赏
  • 举报
回复
有主外键关联
ELement_DG 2008-10-07
  • 打赏
  • 举报
回复
我在生成Hibernate时,已经对XML配置文件进行修改了,也在
<set name="students" inverse="true" cascade="all">
这句中添加了cascade="all" 保证了主子表的级联,发现删除还是无法进行,继续跳出这种异常!

//=========== 引用别人的 ============

这段xml来做的.
Set set = c.getStudents();
c.setStudents(null);//这样做可以使班级对象和它下面的学生对象失去关联, 这样就可以自由操作包含学生对象的set了.
下面就可以用studentDao操作set里面的Student对象,不用我说了吧
Iterator itr = set.iterator();
用itr遍历set里面的student.
studentDao.delete(student_object);

//===================================

在实现删除方法时,自己手动设置 setStudents() 为 NULL 这样就能保证删除时,不会改变了其他表的数据??

我试试看!!

谢谢大家帮忙
tojavastudy 2008-10-06
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~
zou_wei_forever 2008-10-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sunxing007 的回复:]
它说的意思是你的当前的被删除的object里面包含在其他的持久化对象里面, 它极有可能会被再次被级联保存.
比如你有一个班级对象, 班级对象和学生是一对多的关系, 当你load一个班级对象的时候, 该班级下面的所有学生都被级联加载进来, 当你试图删除一个学生的时候, 如果这个学生还在该班级的关联之内, 则会抛出上面的错误.
我昨天刚遇到这个问题.

你可以这么做, 还是以我上面的环境为例子: 先从班级中remove掉这个学生, 这…
[/Quote]
d
gabriel80 2008-10-06
  • 打赏
  • 举报
回复
是不是关联表的事情啊 主外键关联
yanxia611 2008-10-06
  • 打赏
  • 举报
回复



主外键关联, 必须先删除子表,在删除父表
MnziIT 2008-10-05
  • 打赏
  • 举报
回复
在配置文件里面加上这么一句话,inverse=true 看你要删掉那个,在那个里面删,它会帮你先删除关联的 然后再删除这个
無名VF 2008-10-04
  • 打赏
  • 举报
回复
up
sunxing007 2008-10-04
  • 打赏
  • 举报
回复
下面时给你的模拟代码:
班级的映射文件:

<hibernate-mapping>
<class name="model.MyClass" table="class" schema="dbo" catalog="student">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="uuid.hex" />
</id>
<property name="classNo" type="java.lang.String">
<column name="class_no" length="20" not-null="true" />
</property>
<property name="name" type="java.lang.String">
<column name="class_name" length="20" not-null="true" />
</property>
......
<set name="students" inverse="true" cascade="all">
<key>
<column name="classId" length="32" not-null="true" />
</key>
<one-to-many class="model.Student" />
</set>
</class>
</hibernate-mapping>

<set name="students" inverse="true" cascade="all">
这句话有个cascade属性这里设置为all则在删除班级的时候, 和它一起加载进来的学生也可以同时删除. 这样的话就不需要改代码了.

另一种方法,也就是我提到的, 因为有时候我们不必删除所有的学生, 只需要删除其中一个或者一部分.
MyClass c = myClassDao.findById("班级id");
注意:这句话在load班级信息的同时, 会把班级下面的学生一同load进来, 这种关联信息是通过

<set name="students" inverse="true">
<key>
<column name="classId" length="32" not-null="true" />
</key>
<one-to-many class="model.Student" />
</set>

这段xml来做的.
Set set = c.getStudents();
c.setStudents(null);//这样做可以使班级对象和它下面的学生对象失去关联, 这样就可以自由操作包含学生对象的set了.
下面就可以用studentDao操作set里面的Student对象,不用我说了吧
Iterator itr = set.iterator();
用itr遍历set里面的student.
studentDao.delete(student_object);


ELement_DG 2008-10-04
  • 打赏
  • 举报
回复
能给点代码片段吗?
我是明白了,可是不清楚在代码中如何去编写这个
sunyujia 2008-10-04
  • 打赏
  • 举报
回复
在持久层世界里面叫对象关联
在数据库里面就外键约束
办法(以学生班级为例,删班级报错的话)
1。先删学生再删班级
2。通过配置文件级联删除,删除班级的时候,删除全部学习(如何配自己百度级联删除或者等楼下)
sunxing007 2008-10-04
  • 打赏
  • 举报
回复
它说的意思是你的当前的被删除的object里面包含在其他的持久化对象里面, 它极有可能会被再次被级联保存.
比如你有一个班级对象, 班级对象和学生是一对多的关系, 当你load一个班级对象的时候, 该班级下面的所有学生都被级联加载进来, 当你试图删除一个学生的时候, 如果这个学生还在该班级的关联之内, 则会抛出上面的错误.
我昨天刚遇到这个问题.

你可以这么做, 还是以我上面的环境为例子: 先从班级中remove掉这个学生, 这样班级和这个学生就失去了关联, 然后调用dao删除这个学生就可以了.

67,513

社区成员

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

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