java - 添加映射<String, Entity>时约束冲突合并实体

标签 java mysql hibernate jpa dictionary

@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 我有这些实体。一个用户有一张 friend map 。 首先user1将friend2添加到 map ,然后user2将friend1添加到 map , 然后user1将friend3添加到 map ,但是当我进行mergeUser时user3添加friend1时,出现约束违规错误。

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

表 userfriendmap 有 用户名 PK、 friend 用户名 FK、用户用户名 PK FK

我不知道如何解决这个问题。我不知道我为 map 制作表格的方式是否正确。

最佳答案

映射此问题的一种方法如下。请注意,我使用代理键并使用 @MapKey 属性,该属性根据关联值的属性而不是数据库列对 map 进行键控。

@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

关于java - 添加映射<String, Entity>时约束冲突合并实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26444253/

相关文章:

java - 如何使用 JUnit/Ant 加载属性文件?

mysql - 设置 MySQL 的新实例什么是当前根密码?

mysql - JDBC 批量插入性能

java - CircularQueue 程序出现错误

java - 在测试中为 hdfs map reduce 可以设置多低的 Yarn 容器内存?

php - 一次提交多行mysql

java - 使用相同的数据透视表与子类 hibernate 多对多

java - 如何在 tomcat 7 上重新部署 hibernate-c3p0 项目而不会出现奇怪的 c3p0 错误

java - Spring Hibernate,尝试获取实体时堆栈溢出

java.util.Vector 无法转换为 java.util.ArrayList