Java JPA级联所有导致完整性约束
我有三张桌子:雇员、老板和地址 在本例中,员工和老板共享同一地址。当我在Employee上调用EntityManager.remove时,我得到一个完整性约束异常,因为它试图删除地址,但无法删除,因为老板仍然需要它。如果没有人使用这个地址,尽管我希望它被删除。我的注释应该是什么样子的,这样我可以从地址中删除孤立项,但可以避免完整性约束 例外情况=Java JPA级联所有导致完整性约束,java,jpa,eclipselink,one-to-many,entitymanager,Java,Jpa,Eclipselink,One To Many,Entitymanager,我有三张桌子:雇员、老板和地址 在本例中,员工和老板共享同一地址。当我在Employee上调用EntityManager.remove时,我得到一个完整性约束异常,因为它试图删除地址,但无法删除,因为老板仍然需要它。如果没有人使用这个地址,尽管我希望它被删除。我的注释应该是什么样子的,这样我可以从地址中删除孤立项,但可以避免完整性约束 例外情况= Internal Exception: java.sql.SQLIntegrityConstraintViolationException: DELE
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;
}
公共类员工{
@OneToMany(targetEntity=Address.class,OrphanRemoving=true,cascade={
全部
}fetch=FetchType.EAGER)
@JoinTable(name=“员工地址”)
@XmlElement(必需=true)
@订单列
受保护的名单地址;
}
公务舱老板{
@OneToMany(targetEntity=Address.class,OrphanRemoving=true,cascade={
全部
}fetch=FetchType.EAGER)
@JoinTable(name=“Boss\u Address”)
@XmlElement(必需=true)
@订单列
受保护的名单地址;
}
Address类对老板或员工一无所知 您的注释是正确的。删除员工时,它将尝试删除其地址 但是,如果两者使用相同的地址,则删除将失败 在这种情况下,使用不带CasacadeType.DELETE或CasacadeType.ALL的级联选项列表,并以编程方式解决问题 在这种情况下也不要使用孤立删除。参见JPA 2.0规范,第2.9节: 如果作为关系目标的实体从关系中删除(通过设置 关系为null或从关系集合中删除实体),删除操作将应用于孤立的实体。删除操作在执行时应用 冲洗操作。孤儿删除功能适用于其父实体私人“拥有”的实体便携式应用程序不得依赖于 特定的删除顺序,并且不得将已孤立的实体重新分配给其他实体 关系,或尝试将其持久化。如果孤立的实体是分离的新实体, 或删除的实体,删除的语义不适用 如果删除操作应用于托管源实体,则删除操作将被删除 根据第3.2.3节的规则级联到关系目标(因此 无需为关系指定cascade=REMOVE)强>
您可以使用例如
cascade={CascadeType.REFRESH,CascadeType.DETACH}
仅删除Boss/Employ实体,而不删除关联的地址实体