7

Używam Hibernate jako dostawcy JPA (używam jego EntityManagerFactory zamiast jego SessionFactory) w aplikacji Spring Framework. Udało mi się sprawić, że Spring Tracing działa, więc pomijam tę przeszkodę.Jak włączyć wczytywanie czasu pracy/środowiska wykonawczego za pomocą Hibernate JPA i Spring Framework

Muszę włączyć leniwy ładowanie właściwości byte[] i @ManyToOne na obiekcie. Rozumiem, jak narzędzie (splot) moich jednostek na budować czas przy użyciu zadania mrówki Hibernate, ale chciałbym instrumentować moje podmioty w runtime zamiast (czas ładowania tkania). Widziałem już odniesienia do kilku wyników wyszukiwania Google, ale nie mam instrukcji, by je włączyć. Jaką właściwość należy ustawić, aby poinstruować Hibernate, że może instrumentować moje jednostki w czasie wykonywania?

Odpowiedz

25

Po znacznym odczytaniu kodu i debugowaniu, wymyśliłem to. Szkoda, że ​​dokumentacja jądra Hibernate nie zawiera tych informacji. (Aby być uczciwym, Hibernate EntityManager documentation robi, ale nie jest łatwo znaleźć. Na Hibernate instructions on "Using lazy property fetching" mówi tylko: „Lazy loading nieruchomość wymaga buildtime instrumentacji kodu bajtowego”. Czyni nie wzmianka, że ​​można użyć Runtime oprzyrządowanie z właściwością Hibernate EntityManager.)

Najpierw należy ustawić właściwość JPA "hibernate.ejb.use_class_enhancer" na "true" (String). To mówi Hibernate, że może użyć transformacji klasy "serwer aplikacji", wywołując addTransformer w instancji PersistenceUnitInfo. Transformacja klasy "serwer aplikacji" jest naprawdę wiosna LoadTimeWeaver. Jeśli używasz wiosennej konfiguracji Java i LocalContainerEntityManagerFactoryBean, a Hibernate jest zależnością od czasu kompilacji, możesz użyć stałej AvailableSettings.USE_CLASS_ENHANCER zamiast literału literowego "hibernate.ejb.use_class_enhancer" (co spowoduje, że będzie odporna na literówki).

Jeśli używasz Spring konfiguracji Java, jest dodatkowy krok, który musisz podjąć, dopóki nie zostanie naprawiony SPR-10856. LocalContainerEntityManagerFactoryBean 's metoda setLoadTimeWeaver nie jest wywoływana automatycznie tak jak powinna, więc musisz wywołać ją ręcznie. W klasie @Configuration wystarczy @Inject lub @Autowire a LoadTimeWeaver wystąpienie i wywołanie setLoadTimeWeaver ręcznie podczas tworzenia LocalContainerEntityManagerFactoryBean.

Korzystając z podjętych kroków, korzystam z oprzyrządowania bytecode platformy Hibernate przy użyciu Spring Framework w Tomcat.

+0

Waliłam głową o ścianę, próbując to rozgryźć. Ustawienie LoadTimeWeaver w końcu było odpowiedzią. Nie wiem, jak w końcu to rozgryzłeś, ale dzięki! –

+1

Dziękuję bardzo za ten wpis. Dokładnie tego potrzebowałem. – Jazzepi

+1

Wygląda jak SPR-10856 jest naprawiony wiosną 4.3 – Jay

0

Mam podobny problem. Postępowałem zgodnie ze wskazówkami, o których wspomniałeś, aby skonfigurować tkacz z powodzeniem. Utworzono jednostkę czasu wykonywania za pomocą autora bajtów z adnotacjami. I ładowanie tej klasy w czasie szczytu. Utworzono instancję tego samego za pomocą refleksji i próbując przetrwać. Ale hibernacji narzeka jak

java.lang.IllegalArgumentException: Unknown entity: 

wierzę jednostkę czasową run który stworzyłem nie jest wzmocniona i hibernacji narzeka samo.