代码之家  ›  专栏  ›  技术社区  ›  Michael Lorton

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

  •  1
  • Michael Lorton  · 技术社区  · 14 年前

    我认为这是映射实体的映射(即关联数组)的最简单的情况。

    @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中,有两个问题: 首先,它坚持要有一个名为“成员偏好”的表格,就好像这是一种多对多的关系。

    第二,它不起作用:因为它从不填充成员的首选项,所以它从不检索首选项。

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

    1 回复  |  直到 14 年前
        1
  •  3
  •   Michael Lorton    14 年前

    当然,我会花几个小时的时间把问题写在这里,一分钟后…

    总之,答案是@onetomany注释的mappedby元素:

    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="member")
    @MapKey(name = "name")
    private Map<String, Preferences> preferences
             = new HashMap<String, Preferences>(); 
    

    这有一定的意义:多个实体中的哪个字段指向一个实体?即使允许查找匹配的@manytoone字段太容易出错,我认为他们所做的(假设存在映射表)会使情况更糟。