- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试优化我的 @Entity
类。让我们以 User <-> Group
为例。关系。我还想存储建立关系的日期。表格布局:
USER GROUP_USER GROUP
------ ------------ -------
id user_id id
name group_id name
createdAt
具有以下 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());
}
<小时/>
然后是使用 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;
}
它确实按预期创建了 3 个表,但 Group_User
内的列表格很奇怪:
USER GROUP_USER GROUP
------ ------------ -------
id User_id id
name users_KEY name
Group_id
group_KEY
createdAt
我确定我遗漏了一些东西...看起来我必须指定 JoinColumn。但什么是正确的方法呢?
@CollectionTable(joinColumns=...)
和有什么区别和@MapKeyColumn
和@MapKeyJoinColumn
。我必须设置所有这些吗?
或者我必须使用 @ManyToMany
而不是@ElementCollection
?
我只想使用 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;
}
我仍然希望看到这些注释的确切用途的解释,以及为什么默认行为创建了四个列和一个奇怪的主键。
最佳答案
Map 需要一对多键和映射键。
在第一个示例中,Hibernate 发现它需要来自 Group.id
的 FK 来匹配 GroupUser.group_id
来加载关联的用户。但是因为您没有指定 Map 键,所以它必须找出 where to take it from ?
因此,Hibernate 假定您需要一个 @MapKeyColumn
并且由于未指定列名,因此使用属性名称后跟下划线,后跟 KEY(例如 users_KEY)。
这就是为什么你有这两个额外的列。当您提供 @MapKeyJoinColumn(name="User_Id")
时,Map 就知道从哪里获取 key 。
关于hibernate - 使用 @ElementCollection 和 java.util.Map 的 ManyToMany(带有附加列)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18975312/
我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 m
我是 Haskell 的新手,我认为函数 map map和 map.map在 Haskell 中是一样的。 我的终端给了我两种不同的类型, (map.map) :: (a -> b) -> [[a]
我的目标是创建一个 map 的 map ,这样我就可以通过它的键检索外部 map 的信息,然后通过它们的键访问它的“内部” map 。 但是,当我得到每个内部映射时,我最初创建的映射变成了一个对象,我
如何使用 Java8 编写以下代码? for (Entry> entry : data.entrySet()) { Map value = entry.getValue(); if (valu
我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于(准确地)将地图切成图块。 我
所以我有 2 std::map s >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到? 最佳答案 虽然
是否可以将当前查看的 google.maps.Map 转换为静态图像链接,以便我可以获取图像并将其嵌入到 PDF 中? 我在 map 上添加了一些带有自定义图标的标记,所以我不确定这是否真的可行。 如
你能帮我吗 Java Streams ? 从标题可以看出我需要合并List>>进入Map> . 列表表示为List>>看起来像: [ { "USER_1":{
对于 idAndTags 的第二个条目,内部映射被打乱,但第一个条目则不然 第一次接近! for (Map.Entry> entryOne : idAndTags.entrySet()) {
我将从我的代码开始,因为它应该更容易理解我想要做什么: @function get-color($color, $lightness) { @return map-get(map-get($col
我过去曾在许多网站上使用过 Google map ,但遇到了以前从未遇到过的问题。 map 窗口正在显示,但它只显示左上角的 map 片段,以及之后的任何内容(即使我在周围导航时),右侧也不会加载任何
众所周知,这些 map ,无论是常规街道 map 还是卫星 map ,在中国的特定地区都无法正确排列。那么哪个 map 排列正确,是卫星 map 还是默认街道 map ?一些网站表明卫星 map 是正
在拖尾事件之后,我面临着获取此处 map 中的 map 边界的问题。我需要新的经纬度来在新更改的视口(viewport)中获取一些项目/点。我只是想在拖动结束时获得谷歌地图map.getBounds(
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
我有一个 List我想转换成的 e Map>其中外部字符串应为“Name”,内部字符串应为“Domain”。 Name Id Domain e(0) - Emp1, 1, Insuran
我的第 2 部分:https://stackoverflow.com/questions/21780627/c-map-of-maps-typedef-doubts-queries 然后我继续创建 I
是否可以在 1 行中使用 Java8 编写以下所有 null 和空字符串检查? Map> data = new HashMap<>(holdings.rowMap()); Set>> entrySet
我正在审查一个项目的旧代码,并使用 Map 的 Map 的 Map 获得了如下数据结构(3 层 map ): // data structure Map>>> tagTree
这可能是一种不好的做法,但我还没有找到更好的解决方案来解决我的问题。所以我有这张 map // Map>> private Map>> properties; 我想初始化它,这样我就不会得到 Null
我们在 JDK 1.7 中使用 HashMap,我在使用 SonarQube 进行代码审查时遇到了一些问题。 请考虑以下示例: public class SerializationTest imple
我是一名优秀的程序员,十分优秀!