2015-02-23 80 views
1

我有USER(id)和CONTACT(user_id,first,last)表。 CONTACT.user_id是USER表的外鍵。SpringDataJPA保存OneToOne關係獲取無法添加或更新子行:外鍵約束失敗

在User.java:

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private Integer id; 

//bi-directional one-to-one association to Contact 
@OneToOne(mappedBy="user", cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private Contact contact; 

在Contact.java:

@Id 
// @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="USER_ID") 
    private int userId; 

//bi-directional one-to-one association to User 
@OneToOne(cascade = CascadeType.ALL) 
@PrimaryKeyJoinColumn(name = "User_id") 
private User user; 

當我運行userRepository.save(用戶),我得到:

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`mysite`.`contact`, CONSTRAINT `fk_CONTACT_USER1` FOREIGN KEY (`USER_ID`) REFERENCES `user` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION) 

什麼我做錯了嗎?謝謝!

+0

你可以顯示你的代碼中包含'userRepository.save(user)'的部分嗎? – jfun 2015-02-23 21:17:03

回答

0

問題可能是您的ID生成策略(只要您正確初始化了聯繫人)。 必須將用戶對象插入到數據庫才能設置其標識,但同時聯繫人需要此標識爲有效對象。 他們都必須在同一個交易中發生。

如果切換日誌記錄級別爲罰款您的JPA(在perstitance.xml),你很可能會看到插入的用戶和接觸,但接觸的順序將有USER_ID 0

所以,一個)確保你在你的聯繫人中顯式設置用戶(正如你所說的那樣,關係由聯繫人管理)b)在用戶上設置聯繫人。 c)堅持(在一次交易中)。 根據您的JPA實現,它可能仍然不起作用(檢查發出的查詢,很可能會在聯繫人上插入並更新)。將生成策略更改爲TABLE,使用TABLE JPA獲取下一個空閒ID,將其分配給對象,並執行插入操作,以便在插入之前「已知」插入。

相關問題