我看到很多类似的问题,但是没有找到一些结论性的东西。
使用JPA时,如果您有@OneToMany关系,则可以指定它级联REMOVE
操作。同时,可以在数据库中指定外键,并在删除键基行时执行操作。
JPA示例:
@Entity
public class Parent {
@Id
private Long id;
@OneToMany(cascade = {CascadeType.REMOVE})
private List<Child> children;
// getters, setters...
}
@Entity
public class Child {
@Id
private Long id;
@ManyToOne(optional = false)
@JoinColumn(name = parent_id, nullable = false)
private Parent parent;
// getters, setters...
}
在数据库中,Child
表将有一个列parent_id
,其中包含Parent
id
列的外键约束。
对于删除级联的外键约束,可能采取的一些操作是delete
,set to null
和do nothing
。这给出了以下场景组合。
JPA | cascade | no cascade | | remove | remove | DB FK | | | -----------+---------+------------| delete | A | D | -----------+---------+------------| set null | B | E | -----------+---------+------------| do nothing | C | F | -----------+---------+------------+
nullable
和/ optional
中的@ManyToOne
可能需要为true / false。所以,对此有疑问。
以下哪种情况会导致异常?如果图C会出现异常?如果通过Parent
删除EntityManager
实例,则首先在该实例上完成调用,然后级联到集合属性中的Child
实例。但是,在没有先删除相关子项的情况下尝试从数据库中删除父项会导致外键违规。它是否正确?还有其他错误的情况吗? Woud A试图从已经从基础数据库中删除的持久性中删除实体会导致问题吗?
哪个让EntityManager缓存与数据库处于不一致状态?我认为它是D和E.在这些情况下,您必须为实例调用remove()
在孩子名单中自己。
您应该使用哪种设置来强制JPA层和数据库中的数据一致性? A会这样做吗?我认为B也可以工作,因为数据库本身会在删除父项时将外键列设置为null(不再违反约束),然后JPA可以删除子实例。
答案 0 :(得分:0)
我认为B和E也会导致异常,因为外键字段不可为空。
使用null更新其值时,将引发异常。
我认为使用A或F会实现它。在这两个方面,将对这两个层采取相同的行动。