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.
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! –
Dziękuję bardzo za ten wpis. Dokładnie tego potrzebowałem. – Jazzepi
Wygląda jak SPR-10856 jest naprawiony wiosną 4.3 – Jay