0

ほぼ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();

よろしくお願いします!! ありがとうございました :)

セバスチャン

4

1 に答える 1

0

MemberDesire は主キーを生成するように設定されていないため、呼び出すときに

 MemberDesire desire = new MemberDesire();
 member.setMemberDesire(desire); 

null pk がメンバーに関連付けられた無効な MemberDesire エンティティになるはずです。EclipseLink のロギング レベルを Finest に変更すると、発行された SQL とパラメータを確認できます。これは、問題の証明に役立つ可能性があります。既存の MemberDesire を新しいメンバーに関連付けようとしている場合は、新しいオブジェクトを作成する代わりにマネージド インスタンスを関連付けることができるように、エンティティの em.find() API またはクエリを使用する必要があります。

于 2012-08-31T15:16:12.920 に答える