【问题标题】:How to delete only a parent entity in JPA如何在 JPA 中仅删除父实体
【发布时间】:2015-04-11 14:30:26
【问题描述】:

我有一个 Person 对象。 Person 有一个同样是 Person 类型的 manager 属性。

@OneToOne(optional = true, cascade = { CascadeType.ALL })
private Person manager;

假设 John 是经理,Bob 是员工。当我试图删除 John 时,由于 Bob 成为孤儿(没有经理),它失败了。在我的用例中应该允许这样做。但是将这种关系标记为“可选”并没有帮助。而且Cascade在这里似乎没有任何意义。

我认为 JPA 可以做到这一点。有什么帮助吗?

@Entity
public class Person {

@Id
private String id;

private String name;

private Integer age;

private Address address;

@JoinColumn(name = "manager_id", nullable = true, insertable = true, updatable = true)
@OneToOne(optional = true, cascade = { CascadeType.ALL })
private Person manager;

@OneToMany(mappedBy = "manager", cascade = { CascadeType.ALL })
public Collection<Person> reportees;

【问题讨论】:

  • 数据库中的manager_id 列是否配置为非空?
  • Person中的“id”字段应该是manager id,否则没有明确的字段。
  • 使用这些映射,manager_id 必须存在于数据库中。它保存作为“当前”人员的经理的人员的 ID。
  • 如何将其标记为可空(我认为可选会这样做)?我实际上是在使用 JPA bean 来创建数据库架构,而不是其他方式。
  • optional 应该这样做,如果它在数据库中实际上不为空,我只是在徘徊。此外,完整的异常以及导致异常的代码也会有所帮助。

标签: java jpa relationship orphan


【解决方案1】:

我在删除子实体之前删除了父实体。不是理想的解决方案,但对我有用。

我还尝试了双向关系(通过添加 Person 类型的 @ManyToOne 报告者属性)并使用 @JoinColumn 将关系标记为“可选”,也标记为 nullable=true。但没有任何效果。

【讨论】:

    【解决方案2】:

    在尝试删除 John 之前,您应该将 null 设置为 Bob 的经理。此外,@Andrei 是对的,您应该将其映射为双向 @ManyToOne 关系(尽管如果您认识所有以 John 为经理的人,您的代码将起作用)。

    【讨论】:

      【解决方案3】:
      1. 我怀疑关系是@OneToOne,因为有很多员工拥有同一个经理。
      2. 如果您坚持认为它是@OneToOne,则通过在Person Java 类中添加属性来使关系双向:

        @OneToOne(mappedBy="manager", cascade = { CascadeType.ALL }) 
        private Person employee;
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-20
        • 2019-03-23
        • 2018-12-03
        • 2011-03-25
        • 2019-07-09
        • 1970-01-01
        • 1970-01-01
        • 2019-08-14
        相关资源
        最近更新 更多