@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
我不知道如何解决这个问题。我不知道如何为地图制作表格是否正确。
答案 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