添加map <string,entity =“”> </string,>时,约束违规合并实体

时间:2014-10-18 20:29:38

标签: java mysql hibernate jpa map

@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 我有这些实体。一个用户有一个朋友地图。  第一个用户1将friend2添加到地图,然后user2将friend1添加到地图中, 然后user1将friend3添加到地图中,但是当我在创建mergeUser时user3添加friend1时,我遇到了Constraint违规错误。

问题是它创建了一个包含3个属性的表userfriendmap,但只有两个是主键的一部分,它需要是其中的三个。

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

我不知道如何解决这个问题。我不知道如何为地图制作表格是否正确。

1 个答案:

答案 0 :(得分: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