Frage

Ich habe 2 Entitäten / Tabellen.

Einer ist eine richtige Entität, nennen wir es data.Es enthält eine Reihe von Feldern, die sogenannte "mehrsprachige Codes" enthalten.

Der zweite Tisch, code, enthält die mehrsprachigen Werte selbst.

Hier sind einige Beispieldaten :

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

Ich möchte die Eigenschaften Kontinente, Länder usw. in der Datenentität als Karte abbilden, so :

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

Damit ich dann den Text für die richtige Sprache so lesen kann :

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

Ich muss auch in der Lage sein, eine Textsuche nach den Werten dieser "Codes" in der Sprache des Benutzers durchzuführen.(beispielsweise.holen Sie sich alle Daten, bei denen das Land = 'schweiz' ist, auf Französisch!)

Ist es also möglich, a abzubilden OneToMany sammlung mit einem Schlüsselfeld, das nicht der Primärschlüssel der aktuellen Entität ist?Ich brauche meine Kontinentsammlung "alle Datensätze aus der Codetabelle, wobei der Code = der Wert meiner continentCode Eigenschaft".Oder gibt es vielleicht eine angemessenere Art, diese Art von Beziehung darzustellen?

NB :Leider kann ich das SQL-Schema nicht ändern...

War es hilfreich?

Lösung

OK, ich habe die Lösung gefunden.Die OneToMany-Zuordnung auf meiner Datenentität sieht folgendermaßen aus :

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

Ich musste auch die continentCode-Spalte zuordnen, damit sie funktioniert.Ich habe es nicht getan, ich habe eine :

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)

Jetzt kann ich tun :

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

und erhalte die Zeichenfolge "Europa" :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top