2010-07-20 3 views
1

J'ai 2 tables:Comment mapper cette relation dans Hibernate?

La table Data: id, plus de nombreux champs. Certains de ces champs sont des «codes» qui font référence aux valeurs multilingues du tableau suivant, par exemple country_code, continent_code.

Le tableau Thesaurus qui contient les codes multilingues, avec des colonnes: code, code_type, language, text. Le code est unique pour un code_type mais il peut y avoir plusieurs fois le même code avec des valeurs différentes de 'code_type'.

Exemple de données de ce tableau:

code code_type language text 
---------------------------------------------------- 
USA  CNT   EN   United States 
USA  CNT   FR   Etats-Unis 
FR  CNT   EN   France 
FR  CNT   FR   France 
FR  LNG   EN   French 
FR  LNG   FR   Français 

Ainsi, la colonne country_code de la table de données peut contenir 'FR' ou 'US', et la colonne language code peut contenir 'FR' aussi bien. Il est implicite que la colonne country_code contient un code de type 'CNT' pour le pays et la colonne language_code contient un code de type 'LNG' pour la langue.

Comment puis-je mapper ce en veille prolongée afin que je puisse faire quelque chose comme ça dans mon code Java: (supposons que la configuration locale de l'application est l'anglais américain)

myData.getCountryCode(currentLocale.getlanguage()); --> returns 'France' 
myData.getLanguageCode(currentLocale.getlanguage()); --> returns 'French' 

Notez que je ne peux pas modifiez le schéma DB, que je n'ai pas conçu moi-même!

Répondre

1

Vous pouvez avoir une liste de deux POJO différents, qui implémentent la même classe abstraite, dans votre classe Data pour le code de pays et le code de langue (avec le code des champs, la langue et le texte). Pour les mapper, vous pouvez utiliser le "mapping d'héritage" avec une stratégie de table unique et définir la colonne code_type comme colonne discriminante.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
    @DiscriminatorColumn(name = "code_type", discriminatorType = DiscriminatorType.STRING) 

Vous pouvez alors interroger le code de langue ou le code du pays comme suit

myData.getCountryCode(currentLocale.getlanguage()).getText(); --> returns 'France' 
    myData.getLanguageCode(currentLocale.getlanguage()).getText(); --> returns 'French' 

Et vous pouvez définir le code, code_type et colonnes langue comme unique.

Pour plus d'informations, voir la section « héritage Mapping » de mise en veille prolongée here

+0

Merci pour la réponse. Je reçois le bit de mappage de classe abstraite + héritage. Cela semble être une bonne idée. Cependant, comment suggérez-vous de mapper la relation du côté de l'entité de données? en tant que un-à-plusieurs en utilisant la colonne language_code en tant que JoinColumn? Comment puis-je me retrouver avec une carte contenant les entités pour les différentes langues, avec le code de langue comme clé, comme dans notre exemple? –

+0

OK, j'ai compris: j'utilise une carte pour la relation, et j'utilise l'annotation @MapKey pour spécifier que la langue doit être la clé de la carte. –

Questions connexes