質問は少しわかりにくいかもしれないので、例を挙げて説明します。
JPA 2.0とEclipselink 2.2を使用しています
この関係を持つPerson、Student、Credentialsの3 つのクラスがあります。
- Student は Person から継承 (継承)します。
- 学生は資格情報を持っています ( @OneToOne )
私のクラスは次のように定義されています。
Person.java
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING, length = 20)
@DiscriminatorValue("person")
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
private String street;
private String city;
private String zipCode;
private String phoneNumber;
/*Getters and Setters*/
}
学生.java
@SuppressWarnings("serial")
@Entity
@Table(name = "student")
@DiscriminatorValue("student")
public class Student extends Person implements Serializable {
@Column(unique = true)
private String studentId;
@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true, optional = false, mappedBy = "student")
@CascadeOnDelete
private Credentials credentials;
/*Getters and Setters*/
}
Credentials.java
@SuppressWarnings("serial")
@Entity
public class Credentials implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
private String username;
private String password;
private Student student;
}
問題は、生徒を削除しようとすると
entityManager.getTransaction().begin();
entityManager.remove(student);
entityManager.getTransaction().commit();
この制約が表示されます (エラー メッセージの詳細を投稿できますが、これが重要なようです)。
jul 26, 2013 11:51:50 AM com.vaadin.Application terminalError
Grave: Terminal error:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): 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 (`studentrecord`.`credentials`, CONSTRAINT `FK_CREDENTIALS_STUDENT_ID` FOREIGN KEY (`STUDENT_ID`) REFERENCES `person` (`ID`))
Error Code: 1451
Call: DELETE FROM person WHERE (ID = ?)
bind => [36]
Query: DeleteObjectQuery(Alex)
私はいくつかの注釈、一方向、学生と資格情報間の双方向の関係を試しましたが、結果はほとんど常に同じです。
Student エンティティを削除するにはどうすればよいですか?
事前に感謝します。