ほぼ1日の間、JPA/EclipselinkとMySqlに関連する問題に直面しています。MySQLデータベースでは、次の方法で2つのテーブルを構成しました。
Table: Member
memberID int(11) PK AI
desiresID int(11)
email
firstName
lastName
password
Table: MemberDesire
desireID int(11) PK AI
with ForeignKey constraint between Member and MemberDesire
using Member.desireID and MemberDesire.desireID
Eclipseでは、これらのテーブルを自動的にインポートし、リンクを完全に認識します。これらの2つのクラスは次のようになります。
@Entity
public class Member implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int memberID;
private String email;
private String firstName;
private String lastName;
private String password;
//bi-directional many-to-one association to MemberDesire
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="desiresID")
private MemberDesire memberDesire;
と:
@Entity
@Table(name="MemberDesires")
public class MemberDesire implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private int desireID;
private int maximumAge;
private int minimumAge;
//bi-directional many-to-one association to Member
@OneToMany(mappedBy="memberDesire")
private List<Member> members;
これで、MemberDesireが含まれている新しいメンバーをデータベースに永続化しようとすると、次のエラーが表示されます。
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`test`.`member`, CONSTRAINT `desireKey` FOREIGN KEY (`desiresID`) REFERENCES `MemberDesires` (`desireID`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Error Code: 1452
Call: INSERT INTO MEMBER (EMAIL, FIRSTNAME, LASTNAME, PASSWORD, desiresID) VALUES (?, ?, ?, ?, ?,)
bind => [5 parameters bound]
永続化自体は次のように行われます。
EntityManager em = Persistence
.createEntityManagerFactory("TestProject")
.createEntityManager();
EntityTransaction entityTransaction = em.getTransaction();
entityTransaction.begin();
member = new Member();
member.setFirstName(firstName);
member.setLastName(lastName);
member.setEmail(email);
member.setPassword(password);
MemberDesire desire = new MemberDesire();
member.setMemberDesire(desire);
List<Member> members = new ArrayList<Member>();
members.add(member);
desire.setMembers(members);
em.persist(member);
entityTransaction.commit();
em.close();
よろしくお願いします!! ありがとうございました :)
セバスチャン