2011-08-29 14 views
6

Sto tentando di mappare le tabelle da un database (di 60 tabelle) utilizzando JPA. Lo sto facendo per un'applicazione multilingue, quindi ogni dato deve essere disponibile in più di una lingua.Mappatura tabelle i18n in JPA

La mia struttura di tabella del database è simile a questa. Ho una tabella di regioni, che è correlata a una tabella RegionLanguage. La tabella RegionLanguage contiene effettivamente la descrizione per quella regione in diverse lingue. Si consiglia di dare un'occhiata a questo schema:

enter image description here

Quando si tratta di APP, trovo difficile per mappare in modo che richiederebbe come piccole associazioni possibili. Ho provato a utilizzare il concetto di tabella Secondaria, ma in alcune occasioni fallisce poiché si tratta di una relazione @OneToMany. Preferibilmente, stavo pensando ad una soluzione che avrebbe fatto apparire questi due tavoli come un singolo oggetto.

vostro aiuto è apprezzato.

Grazie in anticipo.

+2

Hai trovato una soluzione per questo problema? E se sì, ti dispiacerebbe condividerlo (come risposta)? Stiamo affrontando lo stesso problema, non abbiamo ancora trovato una soluzione soddisfacente (la maggior parte risulta in query N + 1, che sicuramente non vogliamo). – wimvds

+0

Quale provider JPA stai utilizzando? – siebz0r

+0

Non capisco completamente perché una semplice associazione @OneToMany tra Region e RegionLanguage non funzioni per te? –

risposta

0

Non sono sicuro di aver capito questo strano diagramma ... RegionLanguage ha qualche tipo di chiave esterna che punta a Region.id, lo prendo? Se Region ha solo una colonna (come mostrato nel 'diagramma'), puoi semplicemente mappare solo 'RegionLanguage' e avrai una sola entità come vuoi --- nessuna informazione persa;).

Ma seriamente, come vorresti mapparlo? Vuoi avere qualcosa di simile:

class Region { 
//.. the missing fields not shown in diagram 
    List<String> languages; // take only language to avoid creating separate entity for region language 
} 

o qualcosa di simile:

class RegionInnerJoinRegionLanguage { 
// all fields from Region 
// all fields from RegionLanguage 
} 

In ogni caso non hai detto come il resto delle tabelle sono uniti con le tabelle i18n. Dalla tua descrizione, suppongo, che tutte le tabelle abbiano fk su RegionLanguage. Non sono sicuro di quale sia la tabella della regione utilizzata nel grande schema delle cose. Immagino che sia solo per il raggruppamento di lingue ... Immagino questa "modella" Svizzera (una "regione" 4 lingue) ... Ma cosa farai con le lingue parlate in diverse regioni? Avrai diverse lingue in francese, inglese, ecc. (Una per ogni regione) e tutti i dati moltiplicati per ognuna di quelle?

So che non puoi chiedere questo ... Penso solo che hai semplificato la tua struttura dati per questa domanda ... Tanto che è difficile indovinare cosa vuoi veramente raggiungere.

In ogni caso, se si desidera utilizzare l'elenco delle stringhe approccio, si può provare questo:

@ElementCollection 
    @CollectionTable(name="RegionLanguage", 
     [email protected](name="regionID") // or whatever... it's not on your diagram. 
) 
    @Column(name="langage") 
    private List<String> langages; 

io continuo a non capire perché si vuole mettere entrambe le tabelle in un unico soggetto .. Se si tratta di dati "di sola lettura", si potrebbe provare a creare una vista e mapparla --- sempre una "via d'uscita";). Ma è (entrambi, in effetti) un po 'troppo complicato, secondo me --- ti morderà in futuro. Il mio consiglio è di andare con la "semplice mappatura OneToMany".

Problemi correlati