0

我有一个 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;
4

3 回答 3

1

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

于 2015-02-11T09:54:28.980 回答
1
  1. 我怀疑这种关系是@OneToOne,因为有很多员工都有同一个经理。
  2. 如果您坚持它是@OneToOne,则通过在PersonJava 类中添加属性来使关系双向:

    @OneToOne(mappedBy="manager", cascade = { CascadeType.ALL }) 
    private Person employee;
    
于 2015-02-11T09:34:30.640 回答
0

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

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

于 2015-02-12T08:45:26.143 回答