Hibernate拆分多对多关系

jackywang44 2009-06-09 11:05:32
现在需要将一个多对多的关系拆分,比如学生和老师之间的关系,拆成两个多对一,并且中间表也需要实体类、配置文件。我大概是这样做的:
学生表:
<hibernate-mapping default-lazy="false">
<class name="Student" table="t_stutent">
<id name="id" type="long">
<column name="ID" precision="20" scale="0"/>
<generator class="sequence">
<param name="sequence">SEQ_STUTENT</param>
</generator>
</id>
<set name="Teacher" inverse="true" lazy="false" cascade="all-delete-orphan">
<key column="STUTENT_ID"/>
<one-to-many class="StudentTeacher"/>
</set>
</class>
</hibernate-mapping>

教师表:
<hibernate-mapping default-lazy="false">
<class name="Teacher" table="t_teacher">
<id name="id" type="long">
<column name="ID" precision="20" scale="0"/>
<generator class="sequence">
<param name="sequence">SEQ_TEACHER</param>
</generator>
</id>
<set name="stutent" inverse="true" lazy="false" cascade="all-delete-orphan">
<key column="TEACHER_ID"/>
<one-to-many class="StutentTeacher"/>
</set>
</class>
</hibernate-mapping>

中间表(即StutentTeacher类对应的表):
<hibernate-mapping default-lazy="false">
<class name="StutentTeacher" table="t_stu_tea">
<id name="id" type="long">
<column name="ID" precision="20" scale="0"/>
<generator class="sequence">
<param name="sequence">SEQ_STU_TEA</param>
</generator>
</id>
<property name="studentId" type="long">
<column name="STUTENT_ID" precision="20"/>
</property>
<many-to-one name="stutent" class="Stutent" fetch="select" insert="false" update="false">
<column name="STUTENT_ID"/>
</many-to-one>
<property name="teacherId" type="long">
<column name="TEACHER_ID" precision="20"/>
</property>
<many-to-one name="teacher" class="Teacher" insert="false" update="false" fetch="select">
<column name="TEACHER_ID"/>
</many-to-one>
</class>
</hibernate-mapping>

现在问题是在保存、删除的时候,没有什么问题,中间表中的记录都已经写入了。但是在前端做更新操作时有问题,举例说明,比如stutent1中保存了teacher1,我在前端更新stutent1中为teacher2,这时没问题;但当我更新后希望的是stutent1中保存teacher1和teacher2,这时候就有问题了,它会报:
“org.springframework.orm.hibernate3.HibernateSystemException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Stutent.teacher; nested exception is org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Stutent.teacher
Caused by: org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Stutent.teacher”

哪位高手帮我看一下好吧?多谢了!
...全文
729 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanyanjiang618 2012-09-27
  • 打赏
  • 举报
回复
楼主可有解决办法?我现在也正遇到类似问题,希望能把解决办法贴出来,谢谢
guoqiang7175 2010-11-21
  • 打赏
  • 举报
回复
不懂啊
liubinwyzbt 2010-03-10
  • 打赏
  • 举报
回复
通过hibernate工具生成拆分两上一对多关系 是比较完美的方式 但操作上来比较繁琐
zhangd0516 2009-07-01
  • 打赏
  • 举报
回复
cascade设置成all试下
scueczhang 2009-06-27
  • 打赏
  • 举报
回复
为什么一定要自己设置一个中间表的类呢?
好像在配置文件中配置为多对多关系,
最后就可以自动形成中间表的。
zm_hs 2009-06-26
  • 打赏
  • 举报
回复
汗。。没弄明白。不好意思。你是想插分啊!你自己写的那个不行吗?
zm_hs 2009-06-26
  • 打赏
  • 举报
回复
把中间表在程序当中去掉!

角色表

<set name="popmenus" table="rolemidpopmenus" lazy="false">
<key>
<column name="roleid" unique="true" />
</key>
<many-to-many class="com.ipanel.pojo.Popmenus"
column="popmenusid" />
</set>

权限菜单表

<set name="roles" table="rolemidpopmenus" inverse="true" lazy="false">
<key>
<column name="popmenusid" not-null="true" />
</key>
<many-to-many class="com.ipanel.pojo.Role" column="roleid"/>
</set>
Elaine_liya 2009-06-26
  • 打赏
  • 举报
回复
学习
这个不能说 2009-06-26
  • 打赏
  • 举报
回复
haha
vivazhao 2009-06-17
  • 打赏
  • 举报
回复
简单点,t和s分别管好自己,然后中间表管理t和s的联系,两个many2one搞定
kiono 2009-06-17
  • 打赏
  • 举报
回复
不要配置lazy = false
bear13 2009-06-16
  • 打赏
  • 举报
回复
你的意思是s1的t1改成t2没问题,新增t2却有问题?
bmwdoc 2009-06-16
  • 打赏
  • 举报
回复
拿分走人.~~~~~~~~~~~~
jackywang44 2009-06-15
  • 打赏
  • 举报
回复
我现在用多对多的配置方法已经可以实现需求了,但是我还是想大家来讨论下这个拆分情况下的实现。还望赐教啊!
bdceo 2009-06-15
  • 打赏
  • 举报
回复
"比如stutent1中保存了teacher1,我在前端更新stutent1中为teacher2,这时没问题;但当我更新后希望的是stutent1中保存teacher1和teacher2"
你想通过更新student1的teacher1为teacher2
同时数据库保存这个学生有两个老师信息?
这怎么能是更新完成的呢?更新也只是更新对应的一条啊,应该是添加吧?
楼主的业务不是太清楚……这只是我的一点儿理解!
jackywang44 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tjgtgq003 的回复:]
呵呵
[/Quote]
……这……这什么意思
天边星斗 2009-06-12
  • 打赏
  • 举报
回复
呵呵
yeyd87 2009-06-12
  • 打赏
  • 举报
回复
学习``
jackywang44 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lsxjl 的回复:]
你把 cascade="all-delete-orphan"删掉看下
[/Quote]
这个不行,这样连保存都保存不进去
jokerdx 2009-06-12
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~~~~~~~
加载更多回复(6)

67,514

社区成员

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

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