親を使用して: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のみで動作します。この場合、例外は発生しません。
staffGrps.clear()を試したことがありますか?グループ自体を削除する前に、または@OneToManyでorphanRemoval = trueで動作すると確信していました。冗長に見えました。 –
あなたが言ったことを試してみましたが、同じ例外、staffGatestf.getAllGrps()。clear(); staffGatestf.getAllStaffs()。clear(); DB + orphanRemoval = trueの前にメモリから削除する – usertest
クリアすることなく試してみてください。注釈パラメータ –