2014-10-18 27 views
0
@Entity 
public class User { 

    @Id 
    String user_Name; 

    @ElementCollection 
    @CollectionTable(name="userfriendmap") 
    @MapKeyColumn(name="userName") 
    @LazyCollection(LazyCollectionOption.FALSE) 
    Map<String, Friend> friends; 
} 



@Entity 
public class Friend implements Serializable{ 

    @Id 
    String userName; 
} 

我使用Hibernate 我有這些實體。一位用戶有一張朋友的地圖。 首先USER1添加FRIEND2到地圖中,然後用戶2添加朋友1到地圖中,然後 USER1添加friend3地圖,但是當用戶3添加朋友1時,我讓mergeUser我有違反約束的錯誤。約束違規合併實體添加地圖時<String,Entity>

的問題是,它創建一個表userfriendmap與3個屬性,但只有兩個是主鍵的一部分,並且它需要的三個。

表userfriendmap有 userName的PK,friends_userName FK,User_user_Name PK FK

我不知道如何解決這個問題。我不知道這是否是正確的我怎麼做表的映射。映射的

回答

0

的一種方式,這是如下。請注意,我使用的是代理鍵和使用地圖基於相關的價值,而不是數據庫列的屬性,該屬性鍵@MapKey屬性。

@Entity 
@Table(name = "users") 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private Long Id; 

    @Column(name = "user_name", unique = true, nullable = false) 
    private String userName; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "friendships", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "friend_id")) 
    @MapKey(name = "userName") 
    private Map<String, User> friends; 

    public User(){ 
     friends = new HashMap<String, User>(); 
    } 

    //force clients through add/remove to maintain two-way friendship 
    public Map<String, User> getFriends() { 
     return Collections.unmodifiableMap(friends); 
    } 

    //assumes become mutual friends 
    public void addFriend(User friend) { 
     friends.put(friend.userName, friend); 
     friend.friends.put(this.userName, this); 
    } 

    //assumes remove mutual friendship 
    public void removeFriend(User friend) { 
     friends.remove(friend.userName); 
     friend.friends.remove(this.userName); 
    } 

    public User getFriend(String userName) { 
     return friends.get(userName); 
    } 

    public void setUsername(String userName){ 
     this.userName = userName; 
    } 
} 

測試代碼:

@Test 
public void testSaveUser(){ 

    User user1 = new User(); 
    user1.setUsername("user_1"); 

    User user2 = new User(); 
    user2.setUsername("user_2"); 

    User user3 = new User(); 
    user3.setUsername("user_3"); 

    user1.addFriend(user2); 
    user2.addFriend(user3); 

    dao.saveUser(user1); 
} 

加入表數據:

1 2 
2 1 
2 3 
3 2 
+0

這是我的問題的解決方案!非常感謝! – 2014-10-20 10:34:44