2013-08-07 6 views
1

Je suis un débutant à JPA et n'a pas été en mesure de trouver une bonne solution google à cela. Je veux mettre en place une annotation JPA pour un LinkedHashMap de chaînes. Voici la torsion, j'ai une classe abstraite que je cartographie comme mappedSuperClass. Alors que chaque implémentation de cette superclasse a le LinkedHashMap de chaînes. Voici mon exemple:JPA LinkedHashMap annotations

@MappedSuperclass 
public abstract class AbstractCustomerType implements Serializable 
{ 

@ElementCollection //is this right? 
protected LinkedHashMap<String, String> customerData; 
} 

Alors qu'est-ce que je peux attendre dans ma base de données? Chaque implémentation de AbstractCustomerType ayant sa propre table de jointure de customerData? Dans ce cas, si j'ai 10 CustomerTypes, j'aurais 10 tables customerData? Comment est-ce que j'annoncerais ceci de sorte que j'obtienne seulement une table de customerData qui est partagée entre tous les customerTypes?

Répondre

0

Essayez d'utiliser l'annotation @CollectionTable pour définir une seule table. Assurez-vous également que vos identifiants sont uniques pour toutes les sous-classes (utilisez la même séquence).

Envisagez également d'utiliser l'héritage JOINTED. JPA ne permet techniquement que des interfaces, mais EclipseLink permettra l'implémentation (si EAGER, ou LAZY dans les dev builds (2.6)).

2

Cela ne fonctionnera pas du tout. Les collections persistantes doivent être typées avec un type d'interface, et non avec un type concret: Map, Set ou List, mais pas HashMap, LinkedHashMap, HashSet ou ArrayList.

Voir page 23 du the specification:

champs persistants contenant des collections et les propriétés doivent être définies en termes de l'une des interfaces contenant des collections suivantes indépendamment du fait que la classe d'entité adhère par ailleurs aux conventions de méthode JavaBeans noté ci-dessus et si l'accès au champ ou à la propriété est utilisé: java.util.Collection, java.util.Set, java.util.List, java.util.Map. Essayez d'utiliser l'annotation @CollectionTable pour définir une seule table.