2013-04-06 33 views
0

我的問題很簡單:
一個user有一個addressaddresscitystatecountry如何堅持但避免唯一鍵異常?

所以對我有這樣的結構:

public class User { 
    .. 
    //bi-directional many-to-one association to UserAddress 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="id_user_address") 
    private UserAddress userAddress; 
    .. 
} 

注意CascadeType已經CascadeType.ALL因爲如果用戶被刪除它不會影響cities, states and countries創建。

public class UserAddress { 
    .. 
    //bi-directional many-to-one association to AddressCity 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.}) 
    @JoinColumn(name="id_city") 
    private AddressCity addressCity; 

    //bi-directional many-to-one association to AddressCountry 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="id_country") 
    private AddressCountry addressCountry; 

    //bi-directional many-to-one association to AddressState 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="id_state") 
    private AddressState addressState; 
    .. 
} 

我的問題是,如果我嘗試註冊具有例如相同city這讓我異常的用戶:

重度:com.mysql.jdbc.exceptions.jdbc4:致.MySQLIntegrityConstraintViolationException:重複錄入「坎皮納斯」關鍵「city_UNIQUE」

我怎樣才能避免這種constraint,保持CASCADE
還有誰知道如何在我的JSF項目中顯示JPA所做的查詢?

回答

1

CascadeType.PERSIST註解爲User.userAddress導致userAddress被保留用於每個User下來並且被保留CascadeType.PERSIST註解爲UserAddress.addressCity原因addressCity每個UserAddress持續。因此,當你堅持使用同一個城市的用戶時,新城市被試圖堅持使用違反約束的同一個密鑰。因此,刪除那些ManyToOne註釋關係的級聯。

您必須檢查保存用戶userAddress是否已存在,並檢查保存UserAddress內部關係是否已存在並採取所需操作。