Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA级联所有导致完整性约束_Java_Jpa_Eclipselink_One To Many_Entitymanager - Fatal编程技术网

Java JPA级联所有导致完整性约束

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

我有三张桌子:雇员、老板和地址

在本例中,员工和老板共享同一地址。当我在Employee上调用EntityManager.remove时,我得到一个完整性约束异常,因为它试图删除地址,但无法删除,因为老板仍然需要它。如果没有人使用这个地址,尽管我希望它被删除。我的注释应该是什么样子的,这样我可以从地址中删除孤立项,但可以避免完整性约束

例外情况=

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实体,而不删除关联的地址实体