Ruhezustand :OneToMany-Mapping basiert nicht auf PK?
-
26-09-2020 - |
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...
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" :)