1

我有三个表 Employee、Boss 和 Address。

在这种情况下,员工和老板共享相同的地址。当我在 Employee 上调用 EntityManager.remove 时,我得到一个 Integrity Constraint 异常,因为它试图删除它不能删除的地址,因为老板仍然需要它。如果没有人使用该地址,但我希望将其删除。我的注释应该是什么样子,以便我可以从 Address 中删除孤儿但避免完整性约束?

例外 =

Internal Exception: java.sql.SQLIntegrityConstraintViolationException: DELETE on
table 'Employee' caused a violation of foreign key constraint 'Boss....

代码 =

public class Employee {
@OneToMany(targetEntity = Address.class, orphanRemoval = true,cascade = {
    CascadeType.ALL 
} fetch=FetchType.EAGER)
@JoinTable(name = "Employee_Address")
@XmlElement(required = true)
@OrderColumn
protected List<Address> addresses;

}
public class Boss {

 @OneToMany(targetEntity = Address.class, orphanRemoval = true, cascade = {
    CascadeType.ALL 
}fetch=FetchType.EAGER)
@JoinTable(name = "Boss_Address")
@XmlElement(required = true)
@OrderColumn
protected List<Address> addresses;
}

地址类对老板或员工一无所知。

4

2 回答 2

0

您的注释是正确的。删除员工时,它将尝试删除其地址。

但是,如果两者都使用相同的地址,则删除将失败。

鉴于这种情况,请使用不带 CasacadeType.DELETE 或 CasacadeType.ALL 的级联选项列表,并以编程方式解决问题。

也不要在此使用 orphanRemoval。请参阅 JPA 2.0 规范,第 2.9 节:

如果从关系中删除作为关系目标的实体(通过将关系设置为 null 或从关系集合中删除实体),则删除操作将应用于被孤立的实体。删除操作在刷新操作时应用。orphanRemoval 功能适用于由其父实体私有“拥有”的实体。便携式应用程序不得依赖于特定的删除顺序,并且不得将已孤立的实体重新分配给另一个关系或以其他方式尝试保留它。如果被孤立的实体是分离的、新的或已删除的实体,则 orphanRemoval 的语义不适用。

如果删除操作应用于托管源实体,则删除操作将按照第 3.2.3 节的规则级联到关系目标(因此不需要为关系指定 cascade=REMOVE)。

于 2013-07-18T02:16:55.690 回答
0

您可以使用 egcascade = {CascadeType.REFRESH, CascadeType.DETACH}仅删除 Boss/Employ 实体而不删除关联的地址实体。

于 2018-06-20T08:14:22.277 回答