2012-10-07 12 views
10

Sto usando JPA (Hibernate come mio provider JPA). Sto davvero cercando di evitare le specifiche di ibernazione e utilizzare le specifiche JPA. Ho una funzione che inizializza le entità pigre. Sfortunatamente, utilizza funzioni specifiche di ibernazione. Questa è la mia funzione:Metodo JPA standard per inizializzare l'entità pigra

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; 
    } 

Esiste un modo JPA puro per inizializzare le entità?

risposta

7

Non sembra essere un modo standard per inizializzare le entità.

C'è un modo standard per verificare se le entità vengono inizializzati (a pieno carico) o no, e questo è via PersistenceUnitUtil (vedi anche How to test whether lazy loaded JPA collection is initialized?)

Finché l'entità è ancora attaccato, è possibile accedere alle sue proprietà di forzare l'inizializzazione. Questo non è molto pulito, ma funziona in parte. Il rovescio della medaglia è che, a seconda della natura esatta delle proprietà (ad esempio una raccolta con molti elementi), è possibile attivare decine, centinaia o anche molte migliaia di query nel database.

In molti casi è meglio specificare in anticipo ciò che deve essere inizializzato invece di forzare l'inizializzazione (sconosciuta) delle entità a livello di programmazione. Ho scritto un articolo su questo here.

Ma se hai davvero bisogno di inizializzare completamente le entità con una singola chiamata ad un metodo standard per framework, allora sfortunatamente non sembra esserci un modo e per ora dovrai attaccarti al codice specifico di Hibernate.

+2

Per quanto riguarda l'ultima frase: non l'ho mai usato, ma che ne dici di usare Entitygraphs per recuperare entità complete (https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)? Non sarebbe possibile recuperare il grafo di entità di un'entità e aggiungere tutte le proprietà lazy del suo metamodello come AttributeNodes (e quindi recuperarlo)? –

Problemi correlati