Ich verwende Hibernate als JPA-Provider (ich verwende EntityManagerFactory
anstelle von SessionFactory
) in einer Spring Framework-Anwendung. Ich habe es geschafft, die Ladezeit von Spring Framework beim Weben zu unterstützen, also bin ich an dieser Hürde vorbei.
Ich muss das verzögerte Laden von byte[]
und @ManyToOne
Eigenschaften für eine Entität aktivieren. Ich verstehe, wie man meine Entitäten mit build Zeit mit Hibernate's ant task instrumentieren (weben) kann, aber ich möchte stattdessen meine Entitäten bei Laufzeit instrumentieren (load time weaving). Ich habe Referenzen in mehreren Google-Suchergebnissen gesehen, aber keine tatsächlichen Anweisungen zur Aktivierung. Welche Eigenschaft muss ich festlegen, um Hibernate anzuweisen, dass es meine Entitäten zur Laufzeit instrumentieren kann?
Nach langem Lesen von Code und Debugging habe ich das herausgefunden. Es ist eine Schande, dass die Hibernate ORM-Dokumentation diese Informationen nicht enthält. (Um fair zu sein, die Hibernate EntityManager Dokumentation tut, aber es ist nicht leicht zu finden. Hibernate-Anweisungen unter "Verwenden von Lazy-Eigenschaft holen" sagt nur, "Lazy-Eigenschaft Laden benötigt Buildtime Bytecode Instrumentierung." Es macht nicht erwähnen, dass Sie Laufzeit Instrumentierung verwenden können mit einer Hibernate EntityManager-Eigenschaft.)
Als erstes müssen Sie die Eigenschaft "hibernate.ejb.use_class_enhancer"
JPA auf "true"
( String
) setzen. Das teilt Hibernate mit, dass es die Klassenumwandlung "Anwendungsserver" verwenden kann, indem es addTransformer
für die Instanz PersistenceUnitInfo
aufruft. Die Klassenumwandlung "Anwendungsserver" ist wirklich Spring's LoadTimeWeaver
. Wenn Sie die Java-Konfiguration von Spring und LocalContainerEntityManagerFactoryBean
verwenden und Hibernate eine Abhängigkeit zur Kompilierungszeit darstellt, könnten Sie die Konstante AvailableSettings.USE_CLASS_ENHANCER
anstelle des String-Literals "hibernate.ejb.use_class_enhancer"
verwenden (was sie typo-resistent machen würde).
Wenn Sie die Java-Konfiguration von Spring verwenden, müssen Sie einen weiteren Schritt ausführen, bis SPR-10856 angezeigt wird Fest. LocalContainerEntityManagerFactoryBean
s setLoadTimeWeaver
Methode wird nicht automatisch wie gewünscht aufgerufen, Sie müssen sie also manuell aufrufen. In Ihrer @Configuration
-Klasse, nur @Inject
oder @Autowire
a LoadTimeWeaver
-Instanz und% code% manuell aufrufen, wenn Sie setLoadTimeWeaver
erstellen.
Wenn diese Schritte ausgeführt werden, verwende ich jetzt Hibernate's Runtime-Entity-Bytecode-Instrumentierung mit Spring Framework in Tomcat.
Ich habe das ähnliche Problem. Ich folgte den Schritten, die Sie erwähnt haben, um den Weber erfolgreich einzurichten. Ich habe Laufzeiteinheit mit Byte Buddy mit Anmerkungen erstellt. Und diese Klasse zur Nachtzeit laden. Erstellt eine Instanz derselben mit Reflektion und versucht zu persistieren. Aber Winterschlaf klagt wie,
%Vor%Ich glaube, dass die Runtime-Entity, die ich erstellt habe, nicht verbessert wird und Hibernate das gleiche tut.
Tags und Links jpa hibernate spring hibernate-entitymanager load-time-weaving