So aktivieren Sie Ladezeit / Runtime Weben mit Hibernate JPA und Spring Framework

7

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?

    
Nick Williams 24.08.2013, 20:53
quelle

2 Antworten

25

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.

    
Nick Williams 24.08.2013, 22:19
quelle
0

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.

    
SDPS 20.01.2017 11:32
quelle