mysql - Hibernate 中最简单的一对多映射案例在 MySQL 中不起作用

标签 mysql hibernate

我认为这几乎是映射实体 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/

相关文章:

php - 缓存 mysql 插入 - 保持数据完整性

mysql - count 和 group by 的问题以获得 count 为 0 的内连接

mysql - 根据字符串类型的月份对 SQL 数组进行排序

php - 如何显示子类别的面包屑

java - SQL错误: 1366 Incorrect integer value Spring MVC Hibernate

java - JPA - 从一列中获取不同的值(value)

当并非所有子类型都有自己的表时,Hibernate、JPA、连接表继承导致循环依赖错误

mysql - 如何从多个返回值中找到MAX

java - DRools:如何在事实中的任意嵌套列表上使用

java - hibernate 异常 : Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1