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
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.