2016-07-05 18 views
5

Anche se probabilmente una domanda banale, mi sono sempre chiesto questo.DAO/repository: valore restituito buona pratica dopo l'inserimento/aggiornamento

In genere, dopo l'inserimento nel db, sembra prassi comune restituire l'id dell'entità aziendale.

@Override 
public Long createUser(UserEntity user) { 
    em.merge(user); 
    em.flush(); 

    return user.getId(); 
} 

Esiste un motivo convincente per restituire l'id invece del riferimento all'oggetto business stesso?

Analogamente, ho visto update restituire void, mentre potrebbe essere un id/utente.

Se dovessi scrivere un DAO/Repository per altri utenti, quale sarebbe il valore restituito consigliato (se presente) e perché?

+2

l'unione lascia l'entità passata rimossa, copia lo stato in un'entità gestita e restituisce l'entità gestita. Restituire l'ID è inutile: il chiamante lo conosce già da quando lo ha passato nell'entità. Ciò di cui il chiamante ha bisogno è l'entità gestita creata o aggiornata. –

+0

@JBNizet Grazie, ha senso. – Trace

+0

Sì, l'attenzione è qui sul fatto che il comando di unione restituisce l'oggetto entità unita. Secondo me è la migliore pratica. È sufficiente restituire l'oggetto UserEntity restituito dal comando di unione. La ragione di ciò è che solitamente è buona norma non modificare un oggetto passato come parametro. Quindi probabilmente dovresti aspettarti che il metodo fusione non modifichi l'oggetto passato. E restituire sempre lo stesso oggetto non modificato (o parte di esso) che è stato passato al tuo metodo potrebbe non essere così mirato. – Frank

risposta

3

Perché non restituire l'intera istanza se è stata creata/aggiornata correttamente? La stessa cosa primavera dati fare,

<S extends T> S save(S entity); 
<S extends T> Iterable<S> save(Iterable<S> entities); 
  1. Cosa devo fare se ho bisogno di un'altra parte dell'oggetto creato/aggiornato, ad eccezione id? (name, date per l'entità User).

  2. Perché restituisce id se ci sono alcuni campi che caratterizzano esattamente un'istanza (una chiave primaria composta)?

Non c'è difficoltà di restituire l'intero oggetto (non c'è nulla di "testa" qui come detto da @Danny Fonk), ma può risparmiare molto tempo in futuro.

1

Secondo la mia esperienza, nel processo di inserimento restituire l'id all'entità aziendale è una buona pratica perché tale ID potrebbe essere utilizzato completamente per continuare il processo di business in quanto è appena immesso record, inoltre per il processo di aggiornamento si preleva il entità prima di aggiornare il record, quindi non è necessario restituire l'id

+0

Sì, ma per quanto riguarda l'inserzione, quindi restituisce il riferimento dell'oggetto business se l'ID è impostato prima di tornare. D'accordo per la parte di aggiornamento! – Trace

1

Penso anche che restituire l'ID in generale sia buono se non addirittura migliore. Oppure puoi anche restituire l'intero oggetto, ma questo è un po '"overhead" se non hai più bisogno di lavorarci sopra dopo la creazione.

All'aggiornamento/modifica di un oggetto nel database restituiamo sempre l'oggetto stesso o molto probabilmente solo un valore booleano in cui l'aggiornamento è riuscito o meno dal momento che abbiamo già l'oggetto.

1

Se si restituisce l'entità, il codice del client sarebbe simile a questa:

MyEntity e = ...; 
MyEntity created = dao.create(e); 

ma "e" e "creato" sono lo stesso oggetto. Questo può portare a confusione. Si potrebbe obiettare che in futuro è possibile modificare l'implementazione del metodo di creazione in modo che restituisca effettivamente un'entità diversa. Ho visto questo. Non mi è piaciuto Era imho un terribile design di persistenza.

Ora c'è una situazione in cui ritengo che restituire l'id sia una buona opzione: se si dispone di un limite di transazione (REQUIRES_NEW) attorno al metodo di creazione. Passare id invece di entità attraverso i confini delle transazioni non è una cosa negativa.

+0

Non so perché questo sarebbe il caso. Puoi semplicemente fare riferimento all'entità restituita a quella originale ... Ora ci penso, suppongo che tu possa anche tornare vuoto (anche se non sarebbe molto esplicito), poiché ciò che è passato è una copia del riferimento e solo imposta l'id entro il dao. – Trace

+0

puoi ovviamente fare e = dao.create (e); ma perché? – EasterBunnyBugSmasher

Problemi correlati