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

时间:2010-03-24 00:00:32

标签: 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,所以它永远不会检索首选项。

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

1 个答案:

答案 0 :(得分:3)

当然,我把问题解决了几个小时,在这里发布,一分钟后......

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