Hibernate 中最简单的一对多 Map 案例在 MySQL 中不起作用

Mal*_*lio 1 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;
}
Run Code Online (Sandbox Code Playgroud)

这看起来应该在 HSQL 中工作,并且确实如此。在MySQL中,有两个问题:第一,它坚持有一个叫做Members_Preferences的表,好像这是一个多对多的关系。

其次,它不起作用:因为它从不填充 Members_Preferences,它从不检索 Preferences。

[我的理论是,由于我只在内存模式下使用 HSQL,它会自动创建 Members_Preferences,而不必真正检索首选项映射。在任何情况下,要么 Hibernate 有一个巨大的错误,要么我做错了什么。]

Mal*_*lio 6

当然,我花了几个小时来解决这个问题,把它贴在这里,一分钟后......

无论如何,答案是@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 字段太容易出错,我认为他们所做的(假设存在映射表)更糟。