如何通过级联级联@ManyToOne 双向关系?
Posted
技术标签:
【中文标题】如何通过级联级联@ManyToOne 双向关系?【英文标题】:How to cascade @ManyToOne bidirectional relations with cascading? 【发布时间】:2015-08-18 07:52:16 【问题描述】:我想自动持久化/合并Address
个人实体。一旦创建,它们应该可以被任何人更新,但如果 Person
被删除,则不能被删除。
//each person can only have one address
@Entity
public class Person
@ManyToOne
private Address address;
//one address can be assigned to multiple persons (eg family members)
@Entity
public class Address
@OneToMany
private List<Person> persons;
问题:
-
我必须如何为此要求编写
cascade
注释?
如何创建这些实体? person.setAddress(address)
或 address.getPersons().add(person)
?
【问题讨论】:
【参考方案1】:我认为两者上的 @Cascade(CascadeType.MERGE)
都是您要寻找的。p>
我可能会创建并保留一个不带地址的Person
,然后在Address
实体中有类似的内容:
public void addPerson(Person person)
persons.add(person);
person.setAdderess(this);
希望这会有所帮助。
【讨论】:
【参考方案2】:-
要回答您的第一个问题,对于您想要的要求,您
应使用
cascade=CascadeType.REMOVE
以避免删除
Address
如果删除了 Person
:
@OneToMany(cascade = CascadeType.REMOVE mappedBy = "person")
你可以看看this article,它解释了相同情况下的相同行为,说:
如果仅指定 cascade=CascadeType.REMOVE,则不会执行自动操作,因为删除关系不是删除操作。
-
对于要保留两个实体的第二个问题,您应该使用
两个语句放在一起,如下所示:
person.setAddress(address); address.getPersons().add(person);
查看here 了解更多信息。
【讨论】:
您确定要添加CascadeType.REMOVE
。这不应该是唯一应该left的级联类型,以便删除不级联吗?
正如文章中所说:如果仅指定 cascade=CascadeType.REMOVE,则不会采取自动操作,因为删除关系不是删除操作。
不要脱离上下文。这句话是指前面带有orphanRemoval=true
的语句: 如果指定了orphanRemoval=true,则自动删除已删除的地址实例。如果仅指定 cascade=CascadeType.REMOVE,则不会采取自动操作,因为删除关系不是删除操作。
那是什么意思?它们是分开的句子!以上是关于如何通过级联级联@ManyToOne 双向关系?的主要内容,如果未能解决你的问题,请参考以下文章