我认为这几乎是映射实体的 Map(即关联数组)的最简单的情况。
@Entity
@AccessType("field")
class Member {
@Id
protected long id;
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY)
@MapKey(name = "name")
private Map<String, Preferences> preferences
= new HashMap<String, Preferences>();
}
@Entity
@AccessType("field")
class Preferences {
@ManyToOne Member member;
@Column String name;
@Column String value;
}
Run Code Online (Sandbox Code Playgroud)
这看起来应该在 HSQL 中工作,并且确实如此。在MySQL中,有两个问题:第一,它坚持有一个叫做Members_Preferences的表,好像这是一个多对多的关系。
其次,它不起作用:因为它从不填充 Members_Preferences,它从不检索 Preferences。
[我的理论是,由于我只在内存模式下使用 HSQL,它会自动创建 Members_Preferences,而不必真正检索首选项映射。在任何情况下,要么 Hibernate 有一个巨大的错误,要么我做错了什么。]
当然,我花了几个小时来解决这个问题,把它贴在这里,一分钟后......
无论如何,答案是@OneToMany 注释的mappedBy 元素:
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="member")
@MapKey(name = "name")
private Map<String, Preferences> preferences
= new HashMap<String, Preferences>();
Run Code Online (Sandbox Code Playgroud)
这有一定的意义:Many 实体中的哪个字段指向 One 实体?即使允许寻找匹配的 @ManyToOne 字段太容易出错,我认为他们所做的(假设存在映射表)更糟。
| 归档时间: |
|
| 查看次数: |
6430 次 |
| 最近记录: |