2012-08-31 25 views
0

幾乎整整一天,我都遇到了涉及JPA/Eclipselink和MySql的問題。在我的MySQL數據庫我配置以下列方式兩個表:在有外鍵關係的MySQL中JPA/Eclipselink問題持續存在表

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我讓那些表自動導入它承認了完美的連接。這兩個類看起來如下:

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

我將非常感謝您可以給我的任何幫助! 謝謝:)

塞巴斯蒂安

+0

我也嘗試在Eclipse中將關係配置爲「單向」,簡單地將成員發佈的部分留給MemberDesire實例...但它導致同樣的錯誤:( – user1192475

回答

0

MemberDesire未設置有生成的主鍵,所以當你打電話

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

應該導致無效MemberDesire實體與空PK被關聯給會員。您可以將EclipseLink日誌記錄級別設置爲Finest以查看可能有助於證明問題的SQL和參數。如果您嘗試將現有MemberDesire關聯到新成員,則應該使用em.find()api或查詢實體,以便可以關聯受管實例而不是創建新對象。

+0

謝謝我找到了問題,我錯過了將Desire表的關鍵生成器設置爲「身份」。 – user1192475