2016-06-25 14 views
0

親を使用して:StaffGroupJPA:奇妙なカスケード削除動作、OneToMany。 FK違反2人の別々のDAO

@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); 
    } 
    //... 

は今、私はStaffViewと呼ばれる1つのクラスを持って見るために、このクラスであり、これは、2つのStaffGateインスタンス、GroupStaff業務用と別の用を持っていますスタッフ。

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

ここで、私はグループとスタッフを作成して永続化することができます。スタッフエンティティも削除できます。問題は、私はStaffGroupエンティティを削除したい場合は、それは私が代わりにcascade.allを持っている

[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) 

FK違反例外をスローしています。

問題はありますか私はを使用すると、が発生しません。StaffGateインスタンス。

なぜこれが起こりますか?どうすれば修正できますか?

私はStaffGateで削除メソッドの呼び出し前に、この行を追加し、それはまだ同じ問題:私は

、問題の意味は何

更新staffGatestf = new StaffGate();

ただ1つのStaffGateインスタンスを使用すると発生しません。

はClass:StaffViewのものです。私は:staffGatestfインスタンスを削除し、staffGateのみで動作します。この場合、例外は発生しません。

+0

staffGrps.clear()を試したことがありますか?グループ自体を削除する前に、または@OneToManyでorphanRemoval = trueで動作すると確信していました。冗長に見えました。 –

+0

あなたが言ったことを試してみましたが、同じ例外、staffGatestf.getAllGrps()。clear(); staffGatestf.getAllStaffs()。clear(); DB + orphanRemoval = trueの前にメモリから削除する – usertest

+0

クリアすることなく試してみてください。注釈パラメータ –

答えて

0

StaffGateのインスタンスを1つだけ削除して修正しました。しかし、誰かが修正する方法を知っていれば、私はそれを感謝するだろう

関連する問題