2011-12-21 11 views
12

Nelle mie classi Hibernate dovrebbe collezioni esempio essere inizializzatoDovrebbero i classi persistenti inizializzare collezioni variabili di istanza

public class Basket { 
    private List items = new ArrayList(); 

    ...getters and setters... 
} 

o sinistra uninitalized

public class Basket { 
    private List items; 

    ...getters and setters... 
} 

Fa qualche tipo di differenza per Hibernate? Mi sono imbattuto in questo Hibernate documentation dove inizializza il loro HashSet, ma li ho visti spesso non inizializzati.

+0

Per "raccolta di istanze" si intende "proprietà di raccolta persistente"? –

+0

@MikePartridge si, questo è quello che intendevo. – Danny

risposta

6

Dalla documentazione di Hibernate persistent collection:

A causa del modello relazionale sottostante, le proprietà di raccolta valori non supportano semantica di valore nullo. Hibernate non distingue tra un riferimento di raccolta nullo e una raccolta vuota.

E ...

Quando si effettua l'istanza persistente, chiamando persistono(), Hibernate sarà effettivamente sostituire l'HashSet con un'istanza di propria implementazione di Hibernate di Set.

Queste semantiche "non null collection" e "persistent" versus "non persistenti" a volte si perdono con gli sviluppatori. Per mantenere le cose semplici con oggetti Hibernate, preferisco:

  • sempre inizializzare tutte Collections con java.util implementazioni
  • sempre il codice a Collection interfacce

Rendere consuetudine per oggetto Hibernate Collection s non essere mai NULL e evitando la trappola indicata nella documentazione di cui sopra di un oggetto Hibernate Collection in un'implementazione non valida.

8

L'inizializzazione statica come nel primo blocco di codice riduce la necessità di controllo nullo e, se si sa che si utilizzerà la raccolta nella maggior parte dei casi d'uso, è logico.

Se, d'altra parte, la raccolta viene utilizzata raramente, è più opportuno posticipare l'inizializzazione finché non è effettivamente necessario utilizzarla.

0

È necessario inizializzarlo. Anche se Hibernate è in grado di inizializzarlo in seguito, anche se non ha contenuto (che non sono sicuro sia sempre il caso), devi inizializzarlo per essere sicuro che sia sempre coerentemente non nullo.

Nell'esempio fornito è possibile vedere che Cat non ha un costruttore esplicito senza argomenti, pertanto ha per inizializzare il set alla dichiarazione. Molto probabilmente quando lo vedi lasciato non inizializzato c'era anche un esplicito costruttore no-arg che lo inizializzò più tardi.

+0

"Alla ricerca di una risposta che attinga da fonti credibili e/o ufficiali". – SHiRKiT

0

Non riesco a eseguire il backup con alcun tipo di documentazione professionale, ma qui è la mia opinione in merito. Penso che tu abbia due strade possibili da seguire.

DTOs solo

Il primo si basa su fagioli modello da DTOS strisciamento, utilizzati solo per la persistenza dei dati, che svolgono alcuna logica. Qui puoi lasciare i tuoi campi POJO non inizializzati, poiché ciò sarà fatto automaticamente da Hibernate prima di recuperare oggetto persistente tramite Session. Sono sicuro che lo sai già, che Hibernate avvolgerà silenziosamente tutte le raccolte nei propri wrapper, cosa necessaria per mezzo del meccanismo di persistenza interno.

classi modello appropriato

Il secondo approccio richiede POJOs un po 'oltre. In questo scenario è possibile eseguire alcune logiche all'interno dei metodi getter e setter. Questo non è uno scenario insolito, dopotutto è perfettamente accettabile da MVC e molto spesso ci si trova a dover aggiungere del codice. Per esempio - la registrazione delle informazioni durante la chiamata metodo setter, esempio qui sotto:

public void setItems(List<Object> items){ 
    LOGGER.info("Setting '{}' new items", items.size()); 
    this.items = items; 
} 

In tal caso, si potrebbe cadde in difficoltà, dal momento che per quanto ne so la raccolta non verrà inizializzato da Hibernate a questo punto. In tal caso, l'inizializzazione esplicita sarebbe migliore.

Commento finale: non sono l'esperto di Hibernate, inoltre non so se qualcosa è cambiato in 4.x, ma so che ho subito questo problema ad un certo punto.

Problemi correlati