2011-12-21 12 views
12

En mis clases de Hibernate debe ser inicializado colecciones de instanciaclases persistentes inicializar variables de instancia colecciones

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

    ...getters and setters... 
} 

oa la izquierda uninitalized

public class Basket { 
    private List items; 

    ...getters and setters... 
} 

¿tiene algún tipo de diferencia de hibernación? Encontré este Hibernate documentation donde inicializa su HashSet, pero a menudo los he visto sin inicializar.

+0

¿Por 'colección de instancia' quiere decir 'propiedad de recopilación persistente'? –

+0

@MikePartridge sí, eso es lo que quise decir. – Danny

Respuesta

6

De la documentación de Hibernate persistent collection:

Debido al modelo relacional subyacente, las propiedades valuadas en colección no soportan la semántica de valor nulo. Hibernate no distingue entre una referencia de colección nula y una colección vacía.

Y ...

Al realizar la instancia persistente, llamando persisten(), Hibernate realidad reemplazará al HashSet con una instancia de la propia aplicación del Conjunto de Hibernate.

Esta semántica "colección no nula" y "persistente" versus "no persistente" a veces se pierde con los desarrolladores. Para mantener las cosas simples con objetos Hibernate, prefiero:

  • siempre inicializar todos Collections con java.util implementaciones
  • siempre código a Collection interfaces de

Por lo que es habitual que los objetos Hibernate Collection s nunca estar NULL y evitando la trampa que se menciona en la documentación anterior sobre el envío de un objeto de Hibernate Collection a una implementación no válida.

8

Hacer la inicialización estática como en su primer bloque de código reduce la necesidad de una verificación nula, y si sabe que utilizará la colección en la mayoría de los casos de uso, tiene sentido.

Si, por otro lado, la colección se utiliza con poca frecuencia, tiene más sentido posponer la inicialización hasta que realmente la necesite.

0

Debe inicializarlo. Incluso si Hibernate lo inicializa más adelante, incluso si no tiene contenido (que no estoy seguro de que sea siempre el caso), debe inicializarlo para asegurarse de que siempre sea coherente, no nulo.

En el ejemplo proporcionado, puede ver que Cat no tiene un constructor explícito sin argumentos, por lo que tiene para inicializar el conjunto en la declaración. Lo más probable es que cuando lo veas sin inicializar también haya un constructor no-arg explícito que lo haya inicializado más tarde.

+0

"Buscando una respuesta a partir de fuentes creíbles y/o oficiales". – SHiRKiT

0

No puedo respaldarlo con ningún tipo de documentación profesional, pero esta es mi opinión al respecto. Creo que tienes dos caminos posibles a seguir.

dtos única

El primero se basa en los granos de modelo a dtos de civil, que se utiliza sólo para la persistencia de datos, realizando ninguna lógica. Aquí puede dejar sus campos POJO sin inicializar, ya que Hibernate lo hará automáticamente antes de recuperar objetos persistentes mediante Session. Estoy seguro de que ya sabe, que Hibernate envolverá todas las colecciones en sus propias envolturas, lo cual es necesario mediante un mecanismo interno de persistencia.

clases modelo adecuado

El segundo enfoque tiene POJOs un poco más lejos. En este escenario, puede realizar un poco de lógica dentro de los métodos getters y setters. Este no es un escenario poco común, después de todo, es perfectamente aceptable para MVC y muy a menudo uno tendría la necesidad de agregarles algún código. Por ejemplo - la tala alguna información al llamar a un método seleccionador, el siguiente ejemplo:

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

En ese caso, se podría cayó en problemas, ya que por lo que yo sé la colección no será inicializado por Hibernate en este punto. En ese caso, la inicialización explícita sería mejor.

Comentario final: No soy el experto en Hibernate, tampoco sé si algo ha cambiado en 4.x, pero sé que soporté este problema en algún momento.

Cuestiones relacionadas