当前位置: 首页 > 知识库问答 >
问题:

从单向多对多重播中删除,其中级联。移除不是一个选项

梁晋鹏
2023-03-14

我有两个实体,简单地说,部门和员工,
部门和员工有单向多对多关系,部门有员工,但员工不能导航到部门。

然后要删除一个员工,我从员工仓库调用deleteById(员工)deleteById(员工)(它从Spring Data JPA扩展了CrudRepository)

此调用将抛出JdbcSQLIntegrityConstraintViolationException,因为它不会首先删除Department_Employee联接表中的关联。所有部门的员工都必须遵守其免职规定。

实现这一目标的好方法是什么?

我想出了一个主意:

使用@Modifying@Query覆盖CrudRepository中的delete方法。

但是Spring Data JPA似乎不支持在@Query注释中顺序运行多个查询,我不知道如何先删除所有关联,然后在一个JPQL查询中删除员工。

请分享你的想法或做法,非常感谢!

共有1个答案

何志业
2023-03-14

对于这样的问题,我发现从领域驱动设计的角度思考是很有帮助的,领域驱动设计是Spring数据存储库的基础。

有了DDD,部门员工将是不同的集合,因此有两个独立的存储库。如果要同时删除这两个库,那么对员工和员工本身的所有引用都会影响这两个存储库,因此应该在两个单独的方法中处理,然后从单个服务调用这两个方法。

我也倾向于在这里不使用JPA,因为删除所有引用是一个SQL语句,而它需要加载潜在的许多部门实例来删除引用并再次持久化它们。

 类似资料:
  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它会在-预期行为中创建新的行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hib

  • 问题内容: 我在我的数据库3个表:,和 学生可以有多个课程,课程可以有多个学生。和之间存在多对多关系。 我为我的项目和课程添加了3个案例。 (a)当我添加用户时,它会保存得很好, (b)当我为学生添加课程时,它将在-预期行为中再次创建新行。 (三)当我试图删除学生,则在删除适当的记录和,但它也删除其中不需要的记录。即使课程中没有任何用户,我也希望课程在那里。 下面是我的表和注释类的代码。 这是Hi

  • 问题内容: 我正在尝试在SQL Server的同一张表之间创建多对多关系。 我有一张桌子,上面有列和。 关系遵循以下规则: 一个孩子可以有很多父母 父母可以有很多孩子 ObjectA可以是ObjectB的子代,而ObjectB可以是ObjectA的子代 但是对象不能是其本身的直接子代 所以我创建第二个表格的列和,当然我希望这些关系通过级联删除。 但是当我在SQL Server中尝试此操作时,出现错

  • 使用Spring Boot 1.4.0和MySql 5.7 我有两个table并且它是单向的@manytomany,但是在角色的父端,我想删除权限hibernate会自动删除它自己和link-table记录: > 权限

  • 问题内容: 问题: 我 在* 两个实体 A和B 之间 有 多对多关联 。我将 A实体 设置为其 关系 的 所有者 (inverse = true在b.hbm.xml中A的集合上)。 * 当我 删除一个A实体时 , 联接表中的 相应 记录也会被删除 。 当我 删除一个B实体时 , 联接表中的 相应 记录不会被删除 (完整性违反异常)。 - 让我们考虑一些非常简单的 示例 : 文件 a.hbm.xml