我有一个Person对象。Person有一个同样属于Person类型的manager属性。
@OneToOne(optional = true, cascade = { CascadeType.ALL })
private Person manager;
假设约翰是经理,鲍勃是雇员。当我试图删除John时,它失败了,因为Bob变成了孤儿(没有Manager)。在我的用例中应该允许这样做。但将这种关系标记为"可选"并没有帮助。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;
在尝试删除John之前,您应该将null
设置为Bob的经理。此外,@Andrei是对的,您应该将其映射为双向@ManyToOne
关系(尽管如果您认识所有以John为经理的人,则您的代码会起作用)。
- 我怀疑这种关系是
@OneToOne
,因为有很多员工都有同一个经理 -
如果您坚持它是
@OneToOne
,那么通过在Person
Java类中添加属性:,使关系双向@OneToOne(mappedBy="manager", cascade = { CascadeType.ALL }) private Person employee;
在删除子实体之前,我删除了父实体。不是理想的解决方案,但对我有效。
我还尝试了双向关系(通过添加Person类型的@ManyToOne reportees属性),并使用@JoinColumn将关系标记为"可选",还标记为nullable=true。但什么都没用。