web-dev-qa-db-ja.com

注釈を使用して休止状態で「マップ」をどのようにマップしますか?

アノテーションを使用して、文字列の「マップ」(ハッシュテーブル)であるエンティティのフィールドを特定のオブジェクトにどのようにマップしますか?オブジェクトには注釈が付けられ、そのインスタンスはすでに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>

しかし、要素マッピングへの単純なキーでこれを行う方法がわかりません。また、注釈を使用してこれを行う方法がわかりません。

30
Omar Kooheji

単純に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>();
40
Pascal Thivent
@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>();
9
whiskeysierra

私はこの質問が非常に古いことを知っていますが、これは誰かを助けるかもしれません。

他の可能性はそのようなものです:

@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の2つのテーブルのみが生成されます。PreferenceKeyは、ドメイン内のユーザーに対して一意であることに注意してください。

2
Juan

おそらくUserTypeまたはUserCollectionTypeを使用する必要があります。または、カスタムタプライザーを使用できます。

概念については hibernateコアドキュメント を、同等の注釈アプローチについては hibernateアノテーションドキュメント を参照してください。

それがあなたが求めているものではない場合、私に知らせてください。

1
Jeff Walker