有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

添加映射<字符串,实体>

@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添加到地图,然后user2将friend1添加到地图, 然后user1将friend3添加到映射中,但当user3将friend1添加到我创建mergeUser时,会出现违反约束的错误

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

userfriendmap的表 用户名PK,好友\用户名FK,用户名PK FK

我不知道怎么解决这个问题。我不知道我如何为地图做桌子是否正确


共 (1) 个答案

  1. # 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