2009-06-02 6 views
12

J'ai une classe Je ne suis pas sûr de savoir comment annoter correctement.Comment mapper une collection imbriquée, Map <Key, List <Values>>, avec des annotations JPA hibernate?

Mon objectif pour Holder :: données:

  • Liste doit maintenir l'ordre non par le comparateur, mais par l'ordre naturel des éléments du tableau. (Ce qui peut être une colonne ndx si cela est utile.)
  • Le support aura la seule référence aux données, donc Cascade tout est probablement aussi applicable.

Je suis également ouvert à un design différent qui supprime la carte, si cela ferait pour un design plus propre.

@Entity 
public class Holder extends DomainObject { 
    private Map<Enum,List<Element>> data; 
} 

@Entity 
public class Element extends DomainObject { 
    private long valueId; 
    private int otherData; 
} 

@Mappedsuperclass 
public class DomainObject { 
// provides id 
// optimistic locking 
// create and update date 
} 
+0

« de telle sorte que sa liste est ordonnée sur la base de l'arrangement dans le liste ", pouvez-vous reformuler? – wds

+0

@wds cela aide-t-il? –

Répondre

8

Je ne pense pas qu'il est possible avec mise en veille prolongée (-core) à la carte toute collection de collections:

Les collections peuvent contenir presque tous autre type de mise en veille prolongée, y compris tous les types de base , types personnalisés, composants, et bien sûr, des références à d'autres entités.

(de the official doc)

Notez que le presque et l'omission du type de collection.

Une solution de contournement: vous devez introduire un nouveau type "entre" le conteneur de collection et l'élément. Ce type peut être mappé en tant qu'entité ou composant et renvoie le contenu original de la carte, dans ce cas une liste.

Quelque chose comme:

@Entity 
public class Holder extends DomainObject { 
    @OneToMany 
    private Map<Enum,InBetween> inBetweens; 
} 

@Entity 
public class InBetween extends DomainObject { 
    @OneToMany 
    private List<Element> elements; 
} 

@Entity 
public class Element extends DomainObject { 
    private long valueId; 
    private int otherData; 
} 

@Mappedsuperclass 
public class DomainObject { 
// provides id 
// optimistic locking 
// create and update date 
} 

Le reste de la cartographie dépend de votre situation particulière, mais est assez simple.

+0

cela semble bon lemme mull ce sur un peu –

Questions connexes