2012-10-07 41 views
10

Estoy usando JPA (Hibernate como mi proveedor JPA). Realmente estoy tratando de evitar los detalles de hibernación y usar las especificaciones de JPA. Tengo una función que inicializa entidades perezosas. Desafortunadamente, usa funciones específicas de Hibernate. Esta es mi función:Método JPA estándar para inicializar la entidad perezosa

private T initializeAndUnproxy(T entity) { 
     if (entity == null) { 
      throw new 
       NullPointerException("Entity passed for initialization is null"); 
     } 

     Hibernate.initialize(entity); 
     if (entity instanceof HibernateProxy) { 
      entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer().getImplementation(); 
     } 
     return entity; 
    } 

¿Hay alguna forma JPA pura para inicializar entidades?

Respuesta

7

No parece haber una forma estándar de inicializar entidades.

Hay una manera estándar para comprobar si se inicializan entidades (a plena carga) o no, y eso es a través de PersistenceUnitUtil (véase también How to test whether lazy loaded JPA collection is initialized?)

Mientras la entidad está todavía conectado, puede acceder a sus propiedades para forzar la inicialización Esto no es muy claro, pero funciona en cierta medida. La desventaja es que, dependiendo de la naturaleza exacta de las propiedades (por ejemplo, una colección con muchos elementos), puede disparar decenas, cientos o incluso miles de consultas a su base de datos.

En muchos casos, será mejor que especifique por adelantado lo que debe inicializarse en lugar de forzar las entidades de inicialización (desconocidas) mediante programación. Escribí un artículo sobre esto here.

Pero si realmente necesita inicializar por completo las entidades con una sola llamada a algún método de marco estándar, desafortunadamente no parece haber una manera y deberá apegarse al código específico de Hibernate por el momento.

+2

En cuanto a la última frase: Nunca la utilicé, pero ¿qué hay de usar Entitygraphs para buscar entidades completas (https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)? ¿No sería posible obtener el gráfico de entidad de una entidad y agregarle todas las propiedades perezosas de su metamodelo como AttributeNodes (y luego recuperarlo)? –

Cuestiones relacionadas