In un progetto basato su Spring/Hibernate, abbiamo una relazione uno-a-molti tra due entità. Le operazioni richieste sono:Le associazioni bidirezionali in letargo dovrebbero essere evitate?
- trovare il genitore del bambino;
- trovare i figli dei genitori;
- quando il genitore viene rimosso, dobbiamo anche rimuovere i bambini;
- creazione di massa dei bambini.
Abbiamo inventato due modi per implementarlo.
Bidirectional association: entità bambino ha
@ManyToOne
colonna che lo collega al genitore, e il genitore ha@OneToMany
collezione pigro-caricato dei bambini. Tutte le operazioni di cui sopra possono essere eseguite nel modello:child.getParent(); parent.getChildren(); //lazy loading session.delete(parent); //cascade removal of the children does the trick here session.save(parent); //cascade persist created the children
unidirezionale associazione: entità bambino ha
@ManyToOne
colonna che lo collega al genitore, ma il genitore non avere alcun collegamento per i bambini. La maggior parte delle operazioni devono essere eseguite in modalità di servizio:child.getParent(); //still in the model Collection<Child> findChildren(Parent parent); //service method in ChildService void deleteChildren(Parent parent); //service method in ChildService void createChild(Parent parent, ... childAttributes); //service method in ChildService invoked for each new child.
Il primo approccio sembra essere più facile da implementare (è possibile riutilizzare Hibernate funzionalità a cascata), ma alcuni di noi vedere le associazioni bidirezionali come una potenziale causa di problemi .
Quale dovrebbe essere una scelta di design migliore? Ci sono problemi noti, prestazioni o design, creati dall'approccio bidirezionale?
Sei a conoscenza di una fonte che spiega come far funzionare lazyloading? Ho avuto problemi con questo in un progetto JSF. –
"alcuni di noi vedono le associazioni bidirezionali come una potenziale causa di problemi" - puoi citare questi potenziali problemi? –