【问题标题】:How to cascade @ManyToOne bidirectional relations with cascading?如何通过级联级联@ManyToOne 双向关系?
【发布时间】: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;
}

问题:

  1. 我必须如何为此要求编写 cascade 注释?
  2. 如何创建这些实体? person.setAddress(address)address.getPersons().add(person)?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我认为两者上的 @Cascade({CascadeType.MERGE}) 都是您要寻找的。​​p>

    我可能会创建并保留一个不带地址的Person,然后在Address 实体中有类似的内容:

    public void addPerson(Person person) {
       persons.add(person);
       person.setAdderess(this);
    }
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:
      1. 要回答您的第一个问题,对于您想要的要求,您 应使用cascade=CascadeType.REMOVE 以避免删除 Address 如果删除了 Person
      @OneToMany(cascade = CascadeType.REMOVE mappedBy = "person")
      

      你可以看看this article,它解释了相同情况下的相同行为,说:

      如果仅指定 cascade=CascadeType.REMOVE,则不会执行自动操作,因为删除关系不是删除操作。

      1. 对于要保留两个实体的第二个问题,您应该使用 两个语句放在一起,如下所示:
      person.setAddress(address);
      address.getPersons().add(person);
      

      查看here 了解更多信息。

      【讨论】:

      • 您确定要添加CascadeType.REMOVE。这不应该是唯一应该left的级联类型,以便删除级联吗?
      • 正如文章中所说:如果仅指定 cascade=CascadeType.REMOVE,则不会采取自动操作,因为删除关系不是删除操作。
      • 不要脱离上下文。这句话是指前面带有orphanRemoval=true 的语句: 如果指定了orphanRemoval=true,则自动删除已删除的地址实例。如果仅指定 cascade=CascadeType.REMOVE,则不会采取自动操作,因为删除关系不是删除操作。
      • 那是什么意思?它们是分开的句子!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多