2011-03-03 15 views
10

estoy usando la versión 3.6.1.FinalHibernate carga lenta no funciona

que tienen la propiedad siguiente en mi bean de entidad

@JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
private FolderTbl parent; 

En mi prueba de unidad, Assertnull falla porque getParent() es no nulo

assertNull(folderTbl.getParent()); 

¿Qué más debo hacer para detener la hibernación cargando al padre?

Respuesta

8

Incluso si establece la pereza en verdadero, el valor principal no será nulo. La carga diferida usa un objeto proxy y lo asigna a la propiedad principal. Cuando intentamos usar el elemento principal (llame al getParent()), cargará el objeto principal real utilizando el objeto proxy.

Si no desea cargar el objeto, no configure las propiedades JPA para el elemento y configúrelo como transitorio.

+0

Gracias por la explicación.Ahora entiendo –

6

Padres está configurado correctamente a carga perezosamente, el punto es que son pruebas erróneamente.

Hibernate cargará el objeto cuando invoque el método getParent(), cuando se solicite el objeto real, se cargará.

Puede verificar esto configurando show_sql en verdadero. invocará una consulta cuando invoque getParent()

0

Para algunas situaciones, puede que no sea necesario cargar la colección perezosa. Puede tener un método como el siguiente para separar la colección de la sesión.

public class. .... { 
..... 
    @JoinColumn(name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID") 
    @ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY) 
    private FolderTbl parent; 
    ... 
    public void detachLazyObjects() { 
    parent = null; 
    } 

Luego llame a este método para separar la clase de donde la necesita para que sea nula. Utilice este atajo con moderación, le sugiero que piense en otras formas de hacerlo antes de recurrir a esta solución.

0

En realidad, la invocación de getParent() puede devolver una instancia de proxy que muestre que hay un padre. Si accede a campos que no sean el id, el padre se cargará si es necesario.

Tenga en cuenta que el padre ya puede estar cargado por la transacción y así residir en el primer nivel de caché. Si es así, Hibernate normalmente no hará otra consulta a la base de datos.

Como dije antes, si su entidad tiene una referencia no transitoria a un padre, getParent() siempre devolverá un valor no nulo, incluso si el padre no está cargado todavía.

0

Hibernate trata la recuperación Lazy como una pista. Esto es lo que la especificación JPA 2.0 dice en la página 364 Tabla 9.

(Opcional) Si el valor del campo o propiedad debe ser cargados de forma liviana o debe ser recuperada tempranamente. La estrategia EAGER es un requisito en el tiempo de ejecución del proveedor de persistencia que el valor se debe buscar con impaciencia. La estrategia LAZY es una pista del tiempo de ejecución del proveedor de persistencia.

Cuestiones relacionadas