一对多的更新与删除
?项目中遇到多对多关联的情况,刚开始很简单的按一般的设置,在配置文件中指定了第三方表,后来发现这样更新SET的时候不太方便,也看到网上的高手们建议最好把第三方表也实例化成对象,做成两个多对一关联。
<many-to-one name="menuid" cascade="save-update" not-found="ignore"/><many-to-one name="roleid" cascade="save-update" not-found="ignore"/>
</class><set name="menus" cascade="all-delete-orphan" inverse="true" batch-size="20" lazy="true">
??? <key column="roleid"/>
??? <one-to-many not-found="ignore"/>
</set>
</class>
?
<set name="roles" cascade="all-delete-orphan" inverse="true" lazy="true" batch-size="20">??? <key column="menuid"/>
??? <one-to-many not-found="ignore"/>
</set>
</class>
?
?根据角色动态显示菜单,因此角色跟菜单是多对多关联,利用中间类RoleMenu做成 1<--->多<--->1
这样配置起来似乎没有什么问题,但是在修改一个角色所拥有的菜单集合时却遇到了问题:
? A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance
在网上找帮助终于知道通过以下三个步骤可以解决这个问题。
1.把实体类的Set集合方法设置成private :private void setMenus(RoleMenu rm)
2.设置集合的方法成了私有的,所以要增加add方法
先发出了删除集合对象的语句,再发出删除role对象的语句Hibernate: delete from t_role_menu where id=?Hibernate: delete from t_role where id in (?)
?