2012-01-15 11 views
10

Sono molto interessato all'utilizzo di Hibernate per mantenere una mappa come Map<String, Set<Entity>> con un po 'di fortuna (soprattutto perché voglio che tutto sia su un tavolo).C'è un modo migliore per mantenere una mappa con il valore di un set?

Mapping MultiMaps with Hibernate è la cosa che sembra essere più referenziata, che descrive in dettaglio come procedere per l'implementazione usando UserCollectionType.

Mi chiedevo, dato che è stato scritto più di quattro anni fa, c'è un modo migliore di farlo ora?

Quindi, ad esempio, mi piacerebbe avere su EntityA una mappa come Map<String, Set/List<EntityB>>.

Ci sarebbero due tabelle: EntityA e EntityB (con EntityB avere una chiave esterna di nuovo a EntityA).

Non voglio tabelle intermedie.

+1

IMO ancora la strada da percorrere – Firo

+0

Non vedo perché questo è degno di downvoting o di chiusura. C'era un modo "migliore" presentato ma aveva quattro anni.Non penso sia irragionevole chiedere se c'è un modo migliore ora. Forse avrei dovuto qualificarmi meglio come meno verboso o più semplice, ma ancora non è affatto polemico o un'opinione. C'è una risposta o non c'è. – AHungerArtist

+0

+1 per compensare il downvote. IMO una domanda legale. – Firo

risposta

-1

Dipende :) Quando le cose si complicano, dovresti capire cosa sta facendo la tua applicazione.

In alcuni casi, è possibile rappresentare il set come un set di alberi e rappresentare questo set di alberi in una stringa codificata ordinata, ad esempio ["1", "8", "12"] dove 1, 8, 12 sono primari chiavi, quindi scriviamo il codice!

Ovviamente, non è una risposta generale per, a mio parere, una domanda troppo generica.

1

Il modo come il suo fare il mio progetto in corso è che noi trasformare fagioli/collezioni a XML usando xstream:

public static String toXML(Object instance) { 
    XStream xs = new XStream(); 
    StringWriter writer = new StringWriter(); 
    xs.marshal(instance, new CompactWriter(writer)); 
    return writer.toString(); 
} 

e quindi utilizzando il tipo Lob in Hibernate per la persistenza:

@Lob 
@Column(nullable = false) 
private String data; 

I ha trovato questo approccio molto generico e con esso è possibile implementare efficacemente l'archiviazione di chiavi/valori flessibile. Non ti piace il formato XML, quindi il framework Xstream ha un driver integrato per trasformare oggetti in JSON. Fare un tentativo, è davvero fantastico.

Acclamazioni

EDIT: risposta al commento. Sì, se vuoi superare i limiti dell'approccio classico probabilmente stai sacrificando qualcosa come l'indicizzazione e/o la ricerca. È possibile implementare relazioni di indicizzazione/ricerca/straniero/figlio attraverso raccolte/bean di entità generiche da soli: è sufficiente mantenere una tabella chiave/valore separata con il nome della proprietà/i valori della proprietà per i quali si ritiene che la ricerca sia necessaria.

Ho visto il numero di progetti di database per prodotti in cui è necessario uno schema flessibile e dinamico (ovvero creazione di nuovi attributi per oggetti di dominio senza tempi di inattività) e molti di essi utilizzano tabelle chiave/valore per l'archiviazione di attributi e riferimenti di dominio da oggetti proprietario a bambino uno. Questi prodotti costano milioni di dollari (bancari/telco) quindi immagino che questo progetto abbia già dimostrato di essere efficace.

Siamo spiacenti, questa non è la risposta alla tua domanda originale poiché hai chiesto una soluzione senza tabelle intermedie.

+0

Soluzione interessante. Tuttavia, questo rende piuttosto difficile/inefficiente da usare in una ricerca, sfortunatamente. – AHungerArtist

+0

Risposta in modifica. –

Problemi correlati