java - JPA : weird Cascade delete behaviour, 一对多。使用两个单独的 DAO 时发生 FK 违规

标签 java mysql jpa eclipselink cascade

父级:StaffGroup

@Entity
@Table( name = "STAFF_GROUP")
public class StaffGroup implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @OneToMany(mappedBy="staffGroup", cascade = CascadeType.ALL)
    private List<Staff> staffs = new ArrayList<>();

子项:员工

@Entity
@Table( name = "STAFF")
public class Staff implements java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    // Relationships
    @ManyToOne
    @JoinColumn(name = "STAFF_GROUP_ID")
    private StaffGroup staffGroup;

这是一个使用 JPA 和 MySQL 作为数据库的 JavaFX 应用程序。

我为每个实体(staff 和 StaffGroup)都有一个 DAO。还有一个名为 StaffGate 的逻辑类,如下所示:

public class StaffGate {
    // GRP
    private List<StaffGroup> staffGrps = new ArrayList<>();
    private StaffGroupDAO groupDAO = new StaffGroupDAO();

    // Staff
    private static List<Staff> staffList = new ArrayList<>();
    private StaffDAO staffDao = new StaffDAO();

    public void removeFromDBAndMemory(StaffGroup element) {
        groupDAO.remove(element);
        staffGrps.remove(element);
    }
    //...

现在,对于 View ,我有一个名为 StaffView 的类,该类是创建 View 的位置,并且它有两个 StaffGate 实例,一个用于 GroupStaff 操作,另一个用于 Staff。

public class StaffView {
    private StaffGate staffGate = new StaffGate();// Grp operations
    private StaffGate staffGatestf = new StaffGate();// Staff operations

现在,我可以创建一个组和员工,并且它们会被持久化,我也可以删除员工实体。问题是当我想删除 StaffGroup 实体时,它会抛出 FK 违规异常

[EL Warning]: 2016-06-25 10:35:20.567--UnitOfWork(1053875258)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`school-finma`.`staff`, CONSTRAINT `FK_STAFF_STAFF_GROUP_ID` FOREIGN KEY (`STAFF_GROUP_ID`) REFERENCES `staff_group` (`ID`))
Error Code: 1451
Call: DELETE FROM STAFF_GROUP WHERE (ID = ?)
    bind => [1 parameter bound]
Query: DeleteObjectQuery(StaffGroup [id=4, name=Drivers, imageByteInfoEntity=null, staffs={[]}, school=School [id=1, name=Banafsaj, schoolType=USA, address=null, creationDate=2016-06-13, image=ImageByteInfoEntity [id=1, byteImage.length=2793472, width=1024, height=682], active=true], active=true])
Exception in thread "JavaFX Application Thread" javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`school-finma`.`staff`, CONSTRAINT `FK_STAFF_STAFF_GROUP_ID` FOREIGN KEY (`STAFF_GROUP_ID`) REFERENCES `staff_group` (`ID`))
Error Code: 1451
Call: DELETE FROM STAFF_GROUP WHERE (ID = ?)
    bind => [1 parameter bound]
Query: DeleteObjectQuery(StaffGroup [id=4, name=Drivers, imageByteInfoEntity=null, staffs={[]}, school=School [id=1, name=Banafsaj, schoolType=USA, address=null, creationDate=2016-06-13, image=ImageByteInfoEntity [id=1, byteImage.length=2793472, width=1024, height=682], active=true], active=true])
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:879)
    at derbyware.school.dao.AbstractFacade.remove(AbstractFacade.java:49)
    at derbyware.school.logic.StaffGate.removeFromDBAndMemory(StaffGate.java:49)

我确实有cascade.all。

当我使用仅一个 StaffGate 实例时,该问题不会发生。

为什么会出现这种情况?我该如何解决它?

我在StaffGate中调用删除方法之前添加了这一行,但仍然是同样的问题:staffGatestf = new StaffGate();

更新

我的意思

And The problem does NOT occure when I use ONLY ONE StaffGate instance

是在类:StaffView 中我删除了:staffGatestf 实例,并且仅与 StaffGate 一起使用。在这种情况下不会发生异常。

最佳答案

我通过仅删除 StaffGate 的一个实例来修复此问题。但如果有人知道如何解决,我将不胜感激

关于java - JPA : weird Cascade delete behaviour, 一对多。使用两个单独的 DAO 时发生 FK 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38028591/

相关文章:

java - 在从属节点上执行的 Hadoop java 映射器作业,目录问题

java - 你如何在 Spring MVC 中处理 Ajax 请求?

mysql - MySQL @ MariaDB 中 GROUP_CONCAT 内部的 GROUP BY

mysql - 使用IN时出现错误: Subquery returns more than 1 row,

php - CodeIgniter 更新查询不起作用

postgresql - 在 JPA 后面使用 ORDBMS 而不是 RDBMS 有什么好处吗

java - Guice Injector 保持应用程序运行

Java登录系统不起作用;读取第一个用户但无法解析第二个或下一个用户

sql - 选择 ID 列表的最新条目

java - 如何避免将 @RefreshScope 放在应用程序中的多个 bean 上