`

A collection with cascade="all-delete-orphan" was no longer referenced by the

阅读更多

 项目中遇到多对多关联的情况,刚开始很简单的按一般的设置,在配置文件中指定了第三方表,后来发现这样更新SET的时候不太方便,也看到网上的高手们建议最好把第三方表也实例化成对象,做成两个多对一关联。

中间表
<class name="RoleMenu" table="t_role_menu" >
<many-to-one name="menuid" cascade="save-update" not-found="ignore"/>
<many-to-one name="roleid" cascade="save-update" not-found="ignore"/>
</class>
角色
<class name="Role" table="t_role">
<set name="menus" cascade="all-delete-orphan" inverse="true" batch-size="20" lazy="true">
    <key column="roleid"/>
    <one-to-many class="RoleMenu" not-found="ignore"/>
</set>
</class>

 

菜单
<class name="Menu" table="t_menu" batch-size="30">
<set name="roles" cascade="all-delete-orphan" inverse="true" lazy="true" batch-size="20">
    <key column="menuid"/>
    <one-to-many class="RoleMenu" 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方法

public void addRoleMenu(RoleMenu roleMenu){
    roleMenu.setRoleid(this);
    getMenus().add(roleMenu);
}

3.在实现类里

role.getMenus().clear(); //清除集合里的内容,hibernate会并根据cascade="all-delete-orphan"把关联的第三方记录删除

清理完原来的集合后再根据add方法重新给集合添加对象。

这样更新的问题解决了,删除又出现问题了。要删除一个角色,并需要把这个第三方对象的集合也一同删除,却碰到了因为外键关联不能删除的问题。看看配置文件应该没有什么问题。想不通为什么更新role的集合对象时就可以自动删除,到了真正删除的时候却不能删除set里的对象,于是看hibernate发出的sql语句

这是更新set集合里的对象时,先往第三方表里插入新对象,再把原来的对象删除

Hibernate: insert into t_role_menu (menuid, roleid) values (?, ?)
Hibernate: delete from t_role_menu where id=?

 

而在删除Role对象时,只发出了一条删除role的语句,删除代码:

 

	public void delRoles(Object[] ids) {
		Role r = null;
		for(int i = 0; i < ids.length; i++){
			r = getRole((Integer)ids[i]);
			r.getMenus().clear();//与更新时一样,清空集合对象
		}
		this.getSessionFactory()
				.getCurrentSession()
				.createQuery("delete from Role as r where r.id in (:ids)")
				.setParameterList("ids", ids)
				.executeUpdate();
	}

 

没有发出删除集合对象的语句
Hibernate: delete from t_role where id in (?) 
严重: Servlet.service() for servlet action threw exception 
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails

于是把最后一条语句注释,留下清空集合的语句,看看会如何,当然成功的删除了集合里的对象,然后到MySQL命令行里删除这个role对象的记录,可以删除。看来是必须把这个role里的集合先删除了才能删除role对象,但是hibernate不先发送删除集合的命令,  难道要分成两个事务来完成删除一个role对象的动作吗?应该让hibernate先发出删除集合的sql才对。这个时候想到了session的清理缓存:

 

	public void delRoles(Object[] ids) {
		Role r = null;
		for(int i = 0; i < ids.length; i++){
			r = getRole((Integer)ids[i]);
			r.getMenus().clear();
			//加上这个,可以在删除1之前先把多删除,避免出现外键关联约束
			this.getSessionFactory().getCurrentSession().flush();
		}
		this.getSessionFactory()
				.getCurrentSession()
				.createQuery("delete from Role as r where r.id in (:ids)")
				.setParameterList("ids", ids)
				.executeUpdate();
	}

终于,问题解决了,可以更新删除了

先发出了删除集合对象的语句,再发出删除role对象的语句
Hibernate: delete from t_role_menu where id=?
Hibernate: delete from t_role where id in (?)
分享到:
评论

相关推荐

    hibernate_配置cascade_及all-delete-orphan.doc

    3. **all-delete-orphan**: 这是最强大的cascade选项之一,它结合了`save-update`和`delete`的特点,并增加了一个额外的功能——当子实体与父实体之间的关联被解除时,会自动删除那些不再属于任何父实体的子实体。...

    PyPI 官网下载 | django-postgres-delete-cascade-2.0a1.tar.gz

    标题中的“PyPI 官网下载 | django-postgres-delete-cascade-2.0a1.tar.gz”表明这是一个从Python Package Index(PyPI)官方源获取的软件包,名为“django-postgres-delete-cascade”。这个软件包的版本是2.0a1,...

    关于Hibernate级联删除的问题.doc

    对于一对多的关系,如果希望在删除A对象时,同时删除所有相关的AA对象,可以在A.hbm.xml的`&lt;set&gt;`元素中设置`cascade="all-delete-orphan"`。这表示不仅在A被删除时删除所有AA,而且当AA对象被孤儿化(不再与任何A...

    hibernate 学习笔记3

    - `cascade="all-delete-orphan"`:结合`all`和`delete-orphan`特性,当从集合中移除对象时,会立即从数据库中删除该对象。 ### 三、持久化对象状态管理 #### 持久对象状态分类 - **Transient临时态**:仅存在于...

    haarcascade-frontalface-alt haarcascade-frontalface-alt2

    需要注意的是,尽管 OpenCV 提供了多种预训练的分类器(如 `haarcascade-frontalface-alt` 和 `haarcascade-frontalface-alt2`),但在实际应用中可能需要根据具体情况自行训练模型以获得更佳的性能。 在训练过程中...

    深度学习三维重建 cascade-MVSNet-CVPR-202(源码、原文、译文)

    cascade-MVSNet——CVPR-202(源码、原文、译文) cascade-MVSNet——CVPR-202(源码、原文、译文) cascade-MVSNet——CVPR-202(源码、原文、译文) cascade-MVSNet——CVPR-202(源码、原文、译文) cascade-...

    天津大学2017级软件工程计算机视觉课程大作业,,基于改进Cascade_-Cascade-RCNN-.zip

    天津大学2017级软件工程计算机视觉课程大作业,,基于改进Cascade_-Cascade-RCNN-

    cascade-function-.rar_cascade

    在这个场景中,"cascade-function-.rar_cascade" 提供的是一种实现省市级联功能的Java脚本,主要用于Web开发,尤其是前端部分。Dreamweaver是一款流行的Web设计和开发工具,它支持多种编程语言,包括HTML、CSS、...

    haarcascade-frontalface-alt人脸识别分类器文件

    "haarcascade-frontalface-alt.xml"就是这样一个预训练的人脸检测模型,它是一个XML文件,存储了特征检测规则和决策树结构。 **Haar级联分类器的工作原理** 1. **特征选择**:Haar级联分类器首先通过自底向上的...

    人脸锁定haarcascade-frontalface-default.xml

    标题中的“人脸锁定haarcascade-frontalface-default.xml”指的是OpenCV库中用于人脸识别的一个预训练模型文件。这个模型是基于Haar特征级联分类器的,它被广泛应用于计算机视觉领域的人脸检测任务。在Python环境下...

    Ajax-Cascade-Ajax-Select.zip

    Ajax-Cascade-Ajax-Select.zip,这是一个现成的html/jquery源代码,演示了如何构建基于ajax的级联选择。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建...

    haarcascade-frontalface-alt.xml.zip

    标题中的"haarcascade-frontalface-alt.xml.zip"是一个压缩包文件,其中包含了OpenCV库的一个面部检测模型。OpenCV(开源计算机视觉库)是一个强大的工具,广泛应用于图像处理和计算机视觉领域。这个模型,"haar...

    cascade r-cnn paper

    stage by stage, leveraging the observation that the out- put of a detector is a good distribution for training the next higher quality detector. The resampling of progres- sively improved hypotheses ...

    hibernate配置笔记

    - `&lt;set name="items"cascade="all-delete-orphan" inverse="true"&gt;` 描述了`Order`类中名为`items`的集合属性与数据库表的关系。`cascade="all-delete-orphan"`表示当父对象被删除时,所有孤儿子对象也将被删除。`...

    OpenCV人脸识别文件haarcascade-frontalface-default.xml

    在这个场景中,我们关注的是`haarcascade-frontalface-default.xml`文件,这是一个预训练的人脸检测模型。 `haarcascade-frontalface-default.xml`是OpenCV中的一种级联分类器,用于检测图像中的人脸。这种级联分类...

    haarcascade-russian-plate-number.xml.zip

    标题 "haarcascade-russian-plate-number.xml.zip" 指的是一个OpenCV库中的预训练分类器模型,专门用于检测俄罗斯车辆的车牌号码。这个压缩包包含了一个名为 "haarcascade_russian_plate_number.xml" 的文件,这是一...

    java 遇到的各种异常

    `org.springframework.orm.hibernate3.HibernateSystemException`: Don't change the reference to a collection with cascade="all-delete-orphan"** - **异常描述**:试图更改具有`cascade="all-delete-orphan"`...

    人脸harr级联分类器保存的.xml文件,包括:haarcascade-frontalface-default.xml等文件

    在这个场景下,我们关注的是OpenCV中的人脸检测技术,尤其是基于Haar特征的级联分类器,这正是`haarcascade-frontalface-default.xml`文件所代表的。 Haar特征是一种用于图像分析的简单而强大的工具,由Paul Viola...

    CascadeTrainerGUI_3.3.1_x64_Setup.rar

    Cascade Trainer GUI是可用于训练opencv特征,测试和改进级联分类器模型的程序。它使用图形界面来设置参数,并... https://amin-ahmadi.com/cascade-trainer-gui/ 该工具用来代替手动训练opencv 特征集,使用简单。

    Cascade-brushless-doubly-fed-generator-simulation._brushless_bru

    级联式无刷双馈发电机的仿真研究Cascade brushless doubly-fed generator simulation

Global site tag (gtag.js) - Google Analytics