【问题标题】:Constraint violation merge Entity when adding map<String, Entity>添加 map<String, Entity> 时违反约束合并实体
【发布时间】:2014-10-18 20:29:37
【问题描述】:
@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;
}

我使用休眠 我有这些实体。一位用户有一张朋友地图。 首先user1将friend2添加到地图,然后user2将friend1添加到地图, 然后user1将friend3添加到地图中,但是当user3在我进行mergeUser时添加friend1时出现约束违规错误。

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

表 userfriendmap 有 用户名 PK,friends_userName FK,User_user_Name PK FK

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

【问题讨论】:

    标签: java mysql hibernate jpa map


    【解决方案1】:

    一种映射方式如下。请注意,我使用的是代理键并使用 @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
    

    【讨论】:

    • 这就是我的问题的解决方案!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2019-12-08
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多