Ben*_*n M 13 many-to-many hibernate jpa map
我正在尝试优化我的@Entity
课程.让我们来看一个User <-> Group
关系的常见情况.我还想存储建立关系的日期.表格布局:
USER GROUP_USER GROUP
------ ------------ -------
id user_id id
name group_id name
createdAt
Run Code Online (Sandbox Code Playgroud)
有以下3个类:
User
同 @OneToMany List<GroupUser>
GroupUser
用@ManyToOne User
和@ManyToOne Group
Group
同 @OneToMany List<GroupUser>
它有效,但它很常见的常见用例.例如:给我所有组User user
:
List<Group> groups;
for(GroupUser gu : user.getGroupUsers) {
groups.add(gu.getGroup());
}
Run Code Online (Sandbox Code Playgroud)
然后我想到了使用a的Map
想法.所以我创建了以下3个类:
@Entity
class User {
@Column(name="id")
UUID id;
@Column(name="name")
String name;
@ElementCollection
@CollectionTable(name="Group_User")
Map<Group, GroupUserRelationData> groups;
}
@Entity
class Group {
@Column(name="id")
UUID id;
@Column(name="name")
String name;
@ElementCollection
@CollectionTable(name="Group_User")
Map<User, GroupUserRelationData> users;
}
@Embeddable
class GroupUserRelationData {
@Column(name="createdAt")
DateTime createdAt;
}
Run Code Online (Sandbox Code Playgroud)
它确实按预期创建了3个表,但Group_User
表中的列很奇怪:
USER GROUP_USER GROUP
------ ------------ -------
id User_id id
name users_KEY name
Group_id
group_KEY
createdAt
Run Code Online (Sandbox Code Playgroud)
我确定我错过了一些东西......看起来我必须指定JoinColumn.但是正确的方法是什么?
什么之间的区别@CollectionTable(joinColumns=...)
和@MapKeyColumn
和@MapKeyJoinColumn
.我必须设置所有这些吗?
或者我必须使用@ManyToMany
而不是@ElementCollection
?
我只想使用a获得与顶部相同的表格布局java.util.Map
.
编辑#1:此外,数据库之后应该对表具有正确的约束:
目前它创建了一个复合PK(Group_id,users_KEY),这对我来说似乎很奇怪.并且它也产生4(!!)索引,每列一个User_id
,Group_id
,users_KEY
和groups_KEY
.
编辑#2:我找到了一个网站,告诉我何时使用哪些注释:http://kptek.wordpress.com/2012/06/26/collection-mapping/
坏事是:我还是不知道为什么 ......
经过一些尝试后,我想出了以下代码,这正是我想要的.我必须使用所有这些注释,否则它会创建其他列:
@Entity
class User {
@Column(name="id")
UUID id;
@Column(name="name")
String name;
@ElementCollection
@CollectionTable(name="Group_User",
joinColumns=@JoinColumn(name="User_Id"))
@MapKeyJoinColumn(name="Group_Id")
Map<Group, GroupUserRelationData> groups;
}
@Entity
class Group {
@Column(name="id")
UUID id;
@Column(name="name")
String name;
@ElementCollection
@CollectionTable(name="Group_User",
joinColumns=@JoinColumn(name="Group_Id"))
@MapKeyJoinColumn(name="User_Id")
Map<User, GroupUserRelationData> users;
}
@Embeddable
class GroupUserRelationData {
@Column(name="createdAt")
DateTime createdAt;
}
Run Code Online (Sandbox Code Playgroud)
我仍然希望看到这些注释的确切解释,以及为什么默认行为会创建四个列和一个奇怪的主键.
归档时间: |
|
查看次数: |
3529 次 |
最近记录: |