2010-07-21 22 views
2

J'ai 2 entités/tables.Hibernate: le mapping OneToMany n'est pas basé sur PK?

On est une entité appropriée, appelons-le data. Il contient un certain nombre de champs contenant des "codes multilingues".

La deuxième table, code, contient les valeurs multilingues elles-mêmes.

Voici quelques exemples de données:

Data table 
id name   continentCode countryCode 
------------------------------------ 
1 Toto   EU    CH 
2 Titi   AS    CN 

Code table 
id code language text 
---------------------------- 
1 EU  EN  Europe 
2 EU  FR  Europe 
3 EU  DE  Europa 
4 CH  EN  Switzerland 
5 CH  FR  Suisse 
6 CH  DE  Schweiz 
... etc 

Je voudrais cartographier les propriétés continents, pays, etc dans l'entité de données comme une carte, comme ça:

@OneToMany() 
@MapKey(name="languageCode") 
private Map<String, Code> continents; 

Alors que je peux alors lisez le texte pour la bonne langue comme ça:

Data toto = dao.findByName("Toto"); 
String text = toto.getContries.get("FR").getText(); //--> returns "Suisse" 
String text = toto.getContries.get("EN").getText(); //--> returns "Switzerland" 

Je dois aussi pouvoir faire du texte recherche sur les valeurs de ces "codes", en utilisant la langue de l'utilisateur. (par exemple, obtenir toutes les données où le pays = 'suisse', en français!)

Alors, est-il possible de mapper une collection OneToMany en utilisant un champ clé qui n'est pas la clé primaire de l'entité actuelle? J'ai besoin de ma collection de continents "tous les enregistrements de la table de code où le code = la valeur de ma propriété continentCode". Ou peut-être y a-t-il une façon plus appropriée de représenter ce genre de relation?

NB: Malheureusement, je ne peux pas changer le schéma SQL ...

Répondre

2

OK, j'ai trouvé la solution. La cartographie OneToMany sur mon entité de données ressemble à ce que:

@OneToMany() 
@JoinColumn(name="code", referencedColumnName="continentCode", insertable=false, updatable=false) 
@MapKey(name="languageCode") 
private Map<String, AAGeoContinentThesaurusEntry> continents; 

Je devais aussi cartographier la colonne continentCode pour que cela fonctionne. Je fi ne le fais pas, je suis un:

org.hibernate.MappingException: Unable to find column with logical name: GCH_CDE_CODE_CNT in org.hibernate.mapping.Table 
(GCHDATA) and its related supertables and secondary tables 
     at org.hibernate.cfg.Ejb3JoinColumn.checkReferencedColumnsType(Ejb3JoinColumn.java:396) 
     at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:102) 

Maintenant, je peux faire:

myData.getContinentCodes().get("FR").getText() 

et recevoir la chaîne "Europe" :)