2012-10-07 12 views
10

Używam JPA (Hibernate jako mój dostawca JPA). Naprawdę staram się unikać szczegółów dotyczących hibernacji i korzystać ze specyfikacji JPA. Mam funkcję, która inicjuje leniwe byty. Niestety, używa specyficznych funkcji Hibernate. To jest moja funkcja:Standardowa metoda JPA do inicjowania lazy entity

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

Czy istnieje jakiś czysty sposób JPA do inicjowania podmiotów?

Odpowiedz

7

Nie ma standardowego sposobu inicjowania elementów.

Jest to standardowy sposób, aby sprawdzić, czy podmioty są inicjowane (przy pełnym obciążeniu), czy nie, a to poprzez PersistenceUnitUtil (patrz również How to test whether lazy loaded JPA collection is initialized?)

Dopóki jednostka nadal jest podłączony, można uzyskać dostęp do jego właściwości wymuszać inicjalizację. To nie jest bardzo miłe, ale działa do pewnego stopnia. Wadą jest to, że w zależności od dokładnej natury właściwości (np. Kolekcja z wieloma elementami), możesz wystrzelić dziesiątki, setki lub nawet tysiące zapytań do bazy danych.

W wielu przypadkach lepiej jest określić z góry, co należy zainicjować, zamiast wymuszać programowo inicjały (nieznane). Napisałem artykuł o tym here.

Ale jeśli naprawdę musisz w pełni zainicjować elementy za pomocą jednego połączenia z pewną standardową metodą ramową, to niestety nie wydaje się, aby był sposób, i na razie będziesz musiał trzymać się specyficznego kodu Hibernuj.

+2

Odnośnie ostatniego zdania: nigdy go nie używałem, ale co z wykorzystaniem Entitygraphs do pobierania pełnych elementów (https://docs.oracle.com/javaee/7/api/javax/persistence/EntityGraph.html)? Czy nie byłoby możliwe pobranie wykresu encji obiektu i dodanie do niego wszystkich leniwych właściwości jego metamodelu jako AttributeNodes (a następnie pobranie go)? –

Powiązane problemy