Come si mappa una "Mappa" in ibernazione usando le annotazioni?

2022-07-29 13:00:36

Utilizzando le annotazioni come si mappa un campo in un'entità che è una "Mappa" (tabella hash) di String su un determinato oggetto? L'oggetto è annotato e le sue istanze sono già archiviate nel database di ibernazione.

Ho trovato la sintassi per definire una mappa con una chiave semplice e un valore in quanto tale:

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

E stranamente con un'entità come chiave e un tipo semplice come valore in questo modo:

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

Ma non vedo come farlo per una semplice chiave per la mappatura degli elementi e non vedo come farlo usando le annotazioni.

- Omar Kooheji

Source
Risposta


31
  • Potresti semplicemente usare l'annotazione JPA @MapKey (nota che l'annotazione JPA è diversa da quella di ibernazione, quella di ibernazione @MapKey mappa un colonna del database contenente la chiave della mappa, mentre l'annotazione dell'APP mappa la proprietà da utilizzare come chiave della mappa).

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