代码之家  ›  专栏  ›  技术社区  ›  Omar Kooheji

如何使用注释在hibernate中映射“映射”?

  •  29
  • Omar Kooheji  · 技术社区  · 15 年前

    使用注释如何将实体中的字段映射到给定对象,该实体是字符串的“映射”(哈希表)?对象已被注释,其实例已存储在hibernate数据库中。

    <class name="Foo" table="foo">
        ...
        <map role="ages">
             <key column="id"/>
             <index column="name" type="string"/>
             <element column="age" type="string"/>
         </map>
     </class>
    

    <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>
    

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

    4 回复  |  直到 10 年前
        1
  •  40
  •   Pascal Thivent    15 年前

    你可以简单地使用 @MapKey (请注意,JPA注释不同于Hibernate注释,即Hibernate注释 @MapKey

    @javax.persistence.OneToMany(cascade = CascadeType.ALL)
    @javax.persistence.MapKey(name = "name")
    private Map<String, Person> nameToPerson = new HashMap<String, Person>();
    
        2
  •  9
  •   whiskeysierra    15 年前
    @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>();
    
        3
  •  2
  •   Juan    8 年前

    其他可能性如下:

    @Entity
    @Table(name = "PREFERENCE", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "ID_USER", "KEY" })})
    public class Preferences {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID", unique = true, nullable = false)
        private Long id;
    
        @Column(name = "ID_DOMAIN", unique = false, nullable = false")
        private Long domainId;
    
        @Column (name = "PREFERENCE_KEY")
        @Enumerated(EnumType.STRING)
        private PreferenceKey key;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "ID_USER", referencedColumnName = "ID")
        private User user;
    }
    
    and 
    
    @Entity
    @Table(name = "USER", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "LOGIN" })})
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "ID", unique = true, nullable = false)
        private Long id;
    
        @Column(name = "ID_DOMAIN", unique = false, nullable = false")
        private Long domainId;
    
        // more fields
    
        @ElementCollection(fetch = FetchType.LAZY)
        @JoinColumns({@JoinColumn(name = "ID_USER", referencedColumnName = "ID"), @JoinColumn(name = "ID_DOMAIN", referencedColumnName = "ID_DOMAIN")})
        @OneToMany(targetEntity = Preferences.class, fetch = FetchType.LAZY)
        @MapKey(name = "key")
        private Map<PreferenceKey, Preferences> preferencesMap;
    }
    

    这只生成两个表User和Preferences,请注意PreferenceKey对于域中的用户是唯一的

        4
  •  1
  •   Jeff Walker    15 年前

    您可能应该使用UserType或UserCollectionType。或者,您可以使用自定义tupleizer。

    看见 hibernate core documentation 对于概念和 hibernate annotations documentation 对于等效注释方法。