【问题标题】:Implement "reverse" orphan removal with JPA使用 JPA 实现“反向”孤儿删除
【发布时间】:2021-11-17 14:31:19
【问题描述】:

我有一个被其他几个实体引用的实体地址,例如:

@Entity
class Office {
    @OneToOne
    private Address address;

    ...
}

@Entity
class Home {
    @OneToOne
    private Address address;

    ...
}

在哪里

@Entity
class Address {
    @Id
    private Long id;
    private String street;
    private String zipCode;
    
    ...
}

在其他实体中引用 Address 的字段可以为空,所以我希望当 Office.address 设置为 null 时,从数据库中删除引用的实体。

这类似于 orphanRemoval 的工作方式,但在我的情况下,我需要删除 parent 类 (Address) 实例,而不是 child .

有没有办法使用声明性方式来实现这一点,或者我应该手动删除未引用的Addresses?

注意事项

  • 每次创建新的办公室/家庭/等时都会创建一个新地址。被建造。 (没有其他实体引用的共享地址。)

  • 我尝试将 orphanRemoval 应用于 @OneToOne 注释,但将 address 字段设置为 null 不会触发 (Address) 实体从数据库中删除。

  • 我已经检查了这个答案:https://stackoverflow.com/a/31471415/1061499,但这不适用于我的情况。我的 Address 类中不能包含交叉引用。

【问题讨论】:

  • 您在家庭和办公室中使用相同的地址?如果是,那么它是多对一而不是单对一。如果没有,那么您可以使用孤儿删除
  • @SimonMartinelli 不,不一样:每次创建新的办公室/家庭时都会创建一个新地址。我尝试将 orphanRemoval 应用于 OneToOne,但将地址字段设置为 null 不会触发要从数据库中删除的(地址)实体。

标签: java jpa


【解决方案1】:

复制您的问题如下,orphanRemoval 按预期工作: https://github.com/fladdimir/so-jpa/blob/b324b3d2867ba62ee3e96357822ea9aee86a10a0/src/test/java/org/demo/address/AddressTest.java#L57

@Entity
@Data
class Home {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE)
  private Long id;

  @OneToOne(orphanRemoval = true) // should work as shown in the linked test
  private Address address; // <- associated entity is removed when set to 'null'
}

这对你有用吗?如果不是,您的设置有何不同?

【讨论】:

  • 是的,你是对的。我的代码中可能存在一些问题。非常感谢!
猜你喜欢
  • 2011-02-09
  • 1970-01-01
  • 2010-09-23
  • 2013-06-05
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 2015-10-06
相关资源
最近更新 更多