Come usare correttamente Hibernate

1

Sono nuovo di Hibernate quindi la mia domanda potrebbe essere vista come molto semplice, inoltre cercherò di non essere troppo generico (come mi è sempre stato detto per questo), anche se come per tutte le questioni architettoniche è difficile da evitare ... non so mai dove porre queste domande.

Ho configurato una webapp usando Spring + Hibernate. La mia architettura utilizza una serie di controller che fanno uso di servizi che in definitiva chiamano i metodi DAO per ottenere i miei oggetti di dominio.

Ho anche un GenericDAO che implementa tutti i metodi di accesso ai dati di base (findAll, findById, save, delete, update ...) che estendo per il mio Dao concreto, quindi devo solo implementare metodi di accesso ai dati specifici.

Quindi una richiesta per visualizzare tutti gli utenti avrà questo flusso: il controller appropriato viene chiamato attraverso il mapping delle richieste, che alimenta la vista con il risultato chiamando userService.getAllUsers() che allo stesso tempo effettua una chiamata a userDao.findAll() .

Questo è tutto bello e penso che lo sto facendo abbastanza bene.

La mia domanda riguarda le relazioni tra oggetti di dominio, quindi diciamo che gli utenti hanno account e per una vista voglio mostrare i dettagli dell'utente più il suo elenco di account.

Non ho mai scoperto quale sia il modo migliore per raccogliere l'elenco degli oggetti dei conti. Devo contrassegnare la relazione come Eager? Devo effettuare una chiamata in questo modo:

user.accountList = accountService.findAccountsByUser(userId);

se è così allora qual è il punto di specificare la relazione in primo luogo? O forse mi manca qualche altro modo qui?

Cosa succede con le relazioni da molte a molte? Sono obbligato a creare un oggetto dominio chiamato UserAccount (supponendo che un account possa essere associato a più utenti) che mappa le relazioni tra i due?

    
posta kelmer 25.08.2013 - 14:23
fonte

1 risposta

1

Puoi anche controllare il recupero "eager / pigro" al momento della query. Dai documenti:

link

A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections.

Penso che la domanda più specifica che vuoi porre sia: come evitare di caricare troppi oggetti (più del necessario per una determinata situazione) ma allo stesso tempo, quando I do voglio per caricarli tutti, come evitare il N + 1 problema selezionato ?

Una regola del pollice può essere la seguente: qual è la modalità più utilizzata per ottenere i dati X per la mia applicazione? Per lo più ne ho bisogno con le sue sotto-entità popolate o raramente ho bisogno anche di quelle. Questa regola dovrebbe guidarti nell'impostazione dell'assunzione avida / pigra sull'associazione. Quindi, per quei casi non standard in cui hai bisogno di dati in modo diverso dall'annotazione dichiarata o pigro a livello di relazione, puoi sovrascriverli utilizzando il join di recupero a livello di query sopra indicato.

Un buon modo per ricontrollare tutto questo è eseguire il debug di Hibernate al livello SQL generato. Ad esempio, questo può mostrare rapidamente se una determinata (singola) query Hibernate diventa una serie di (N + 1) selezioni quando viene tradotto in SQL. Ecco un buon articolo su come configurare questo:

link

    
risposta data 28.01.2014 - 15:52
fonte

Leggi altre domande sui tag