如何通过级联级联@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 双向关系?的主要内容,如果未能解决你的问题,请参考以下文章

休眠级联持续存在:执行隔离工作时出错

如何在 Hibernate 3.6 中正确级联保存主键上的一对一双向关系

hibernate多对多双向关系映射的级联配置

ManytOone的级联保存

JPA 2.1 外键没有保存在 ManyToOne 级联上

Hibernate--cascade级联