@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/