你如何使用注释在休眠中映射"地图"?

Oma*_*eji 30 java mapping orm hibernate

使用注释如何将实体中的字段映射到给定对象的字符串"Map"(Hashtable)?该对象已注释,其实例已存储在hibernate数据库中.

我已经找到了使用简单的键和值来定义地图的语法:

<class name="Foo" table="foo">
    ...
    <map role="ages">
         <key column="id"/>
         <index column="name" type="string"/>
         <element column="age" type="string"/>
     </map>
 </class>
Run Code Online (Sandbox Code Playgroud)

奇怪的是,一个实体作为键,一个简单类型作为值,如下所示:

<class name="Foo" table="foo">
    ...
  <map role="ages">
    <key column="id"/>
    <index-many-to-many column="person_id" 
         class="Person"/>
    <element column="age" type="string"/>
  </map>
</class>
<class name="Person" table="person">
    ...
    <property name="name" column="name" 
         type="string"/>
</class>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何为元素映射的简单键做到这一点,我不知道如何使用注释来做到这一点.

Pas*_*ent 40

您可以简单地使用JPA注释 @MapKey(请注意,JPA注释与Hibernate注释不同,Hibernate会@MapKey映射一个包含地图键的数据库列,而JPA的注释会映射该属性以用作地图的键).

@javax.persistence.OneToMany(cascade = CascadeType.ALL)
@javax.persistence.MapKey(name = "name")
private Map<String, Person> nameToPerson = new HashMap<String, Person>();
Run Code Online (Sandbox Code Playgroud)

  • @Omar它创建一个连接表(默认为FOO_PERSON).您可以使用`@javax.persistence.JoinTable`来控制名称.不确定列. (2认同)

whi*_*rra 9

@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(name = "JOINTABLE_NAME",
    joinColumns = @JoinColumn(name = "id"))
@MapKey(columns = @Column(name = "name"))
@Column(name = "age")
private Map<String, String> ages = new HashMap<String, String>();
Run Code Online (Sandbox Code Playgroud)