Jpa 从单向多对多重放中删除,其中Cascade.Remove不是选项
“为了简化,我有两个实体,”部门和员工说,Jpa 从单向多对多重放中删除,其中Cascade.Remove不是选项,jpa,spring-data-jpa,Jpa,Spring Data Jpa,“为了简化,我有两个实体,”部门和员工说, 部门和员工之间存在单向多对多关系, 部门具有员工属性,但员工无法导航到部门 然后,要删除员工,我从EmployeeRepository调用deleteById(employeeId)或delete(Employee) (它扩展了Spring数据JPA的积垢存储) 此调用将抛出JdbcSQLIntegrityConstraintViolationExceptionJdbcSQLIntegrityConstraintViolationException,因
部门和员工之间存在单向多对多关系, 部门具有
员工
属性,但员工无法导航到部门
然后,要删除员工,我从EmployeeRepository调用deleteById(employeeId)
或delete(Employee)
(它扩展了Spring数据JPA的积垢存储)
此调用将抛出JdbcSQLIntegrityConstraintViolationExceptionJdbcSQLIntegrityConstraintViolationException,因为它不会首先删除部门员工联接表中的关联员工的免职必须在其与部门的所有协会的免职之后进行。
实现这一目标的好方法是什么
我想到了一个主意:
使用@Modifying
和@Query
覆盖CrudRepository中的delete
方法
但是Spring Data JPA似乎不支持在@Query
注释中顺序运行多个查询,我不知道如何首先删除所有关联,然后在一个JPQL查询中删除员工
请分享您的想法或做法,非常感谢 对于这样的问题,我发现从域驱动设计的角度来思考是很有帮助的,域驱动设计是Spring数据存储库的基础 对于DDD,部门和员工将是不同的集合,因此有两个独立的存储库。 如果要同时删除这两个存储库,那么对员工和员工本身的所有引用都会影响这两个存储库,因此应该在两个单独的方法中处理,然后从单个服务调用这两个方法
我也倾向于在这里不使用JPA,因为删除所有引用都是一条SQL语句,而它可能需要加载许多
Department
实例才能删除引用并再次持久化它们。对于这样的问题,我觉得从域驱动设计的角度考虑是很有帮助的,这是Spring数据存储库的基础
对于DDD,部门和员工将是不同的集合,因此有两个独立的存储库。
如果要同时删除这两个存储库,那么对员工和员工本身的所有引用都会影响这两个存储库,因此应该在两个单独的方法中处理,然后从单个服务调用这两个方法
我也倾向于在这里不使用JPA,因为删除所有引用都是一条SQL语句,而只需删除引用并再次持久化它们,就可能需要加载许多Department
实例