我认为这几乎是映射实体 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;
}
这看起来应该可以在 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>();
这具有一定的意义:Many 实体中的哪个字段指向了 One 实体?即使允许寻找匹配的 @ManyToOne 字段也太容易出错,我认为他们所做的事情(假设存在映射表)会变得更糟。
关于mysql - Hibernate 中最简单的一对多映射案例在 MySQL 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2504504/