per*_*erp 87 java jpa many-to-one jpa-2.0
假设我有如下的单向 @ManyToOne
关系:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
}
@Entity
public class Child implements Serializable {
@Id
@GeneratedValue
private long id;
@ManyToOne
@JoinColumn
private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个父P和子C 1 ... C n引用回P,那么在JPA中有一个干净漂亮的方法可以在删除P时自动删除子C 1 ... C n(即entityManager.remove(P)
)?
我正在寻找的是类似于ON DELETE CASCADE
SQL 的功能.
Tho*_*ker 80
如果您使用hibernate作为JPA提供程序,则可以使用注释@OnDelete.此注释将添加触发器ON DELETE CASCADE的关系,它将子项的删除委托给数据库.
例:
public class Parent {
@Id
private long id;
}
public class Child {
@Id
private long id;
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)
使用此解决方案,从孩子到父母的单向关系足以自动删除所有孩子.此解决方案不需要任何侦听器等.此外,DELETE FROM Parent WHERE id = 1之类的查询将删除子节点.
Vin*_*lds 69
JPA中的关系始终是单向的,除非您在两个方向上将父级与子级关联.从父母到孩子的级联REMOVE操作将需要从父母到孩子的关系(而不仅仅是相反的).
因此,您需要这样做:
@ManyToOne
关系更改为双向关系@ManyToOne
或单向关系@OneToMany
.然后,您可以级联REMOVE操作,以便EntityManager.remove
删除父项和子项.您还可以指定orphanRemoval
为true,以便在父集合中的子实体设置为null时删除任何孤立子项,即在子项不存在于任何父项集合中时将其删除.ON DELETE CASCADE
.您需要在调用EntityManager.clear()
之后调用,EntityManager.remove(parent)
因为需要刷新持久性上下文 - 在数据库中删除子实体后,子实体不应该存在于持久性上下文中.tek*_*ara 13
创建一个双向关系,如下所示:
@Entity
public class Parent implements Serializable {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE)
private Set<Child> children;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
85424 次 |
最近记录: |