Domanda

Ho 2 entità / tabelle.

Uno è un'entità corretta, chiamiamolo data. Ha un numero di campi contenenti i cosiddetti "codici multilingue".

La seconda tabella, code, contiene i valori multilingue stessi.

Ecco alcuni dati di esempio:

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
.

Vorrei mappare i continenti Proprietà, i paesi ecc. Nell'entità dei dati come mappa, in questo modo:

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

In modo che possa leggere il testo per la lingua giusta del genere:

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

Devo anche essere in grado di effettuare la ricerca di testo sui valori di questi "codici", utilizzando la lingua dell'utente. (ad esempio ottenere tutti i dati dove il paese= 'Suisse', in francese!)

Quindi, è possibile mappare una raccolta OneToMany utilizzando un campo chiave che non è la chiave primaria dell'entità corrente? Ho bisogno della mia collezione dei miei continenti "Tutti i record dalla tabella del codice in cui il codice= il valore della mia proprietà continentCode". O forse c'è un modo più appropriato per rappresentare questo tipo di relazione?

NB: Purtroppo non posso cambiare lo schema SQL ...

È stato utile?

Soluzione

OK, ho trovato la soluzione.La mappatura di Onetomany sulla mia entità dati è simile a quella:

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

Ho anche dovuto mappare la colonna ContinentCode per funzionare.Non lo faccio, ho ricevuto 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)
.

Ora posso fare:

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

e ricevi la stringa "Europa" :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top