2014-10-18 26 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