Search code examples
mysqljpaeclipselinkforeign-key-relationshippersist

JPA / Eclipselink issue persisting table in MySQL with foreign-key relationship


For almost one entire day I am facing a problem involving JPA/ Eclipselink and MySql. In my MySQL database I configured two tables in the following way:

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

In Eclipse I let those tables be imported automatically and it recognizes the linking perfectly. Those two classes look as follows:

    @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;

and:

    @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;

Now when I'm trying to persist a new Member with an included MemberDesire to the database the following error appears:

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]

The persisting itself is done in this way:

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

I would very much appreciate any help you could give me!! Thank you :)

Sebastian


Solution

  • MemberDesire is not set to have a primary key generated, so when you call

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

    it should result in an invalid MemberDesire entity with a null pk being associated to the member. You can turn EclipseLink logging level to Finest to see the SQL and the parameters that are issued which might help prove the problem. If you are trying to associate an existing MemberDesire to a new Member, you should use the em.find() api or query for the entity so that you can associate the managed instance instead of creating a new object.