Mit Spring definierten transactionManager in JPA/Hibernate
Angenommen, Sie verwenden JPA mit Spring mit Hibernate als JPA-Implementierung.
Der JPA-Transaktions-Modus "JTA", so dass Sie brauchen, um passieren die container transactionManager zu Überwintern.
Die klassische Antwort ist, um hibernate.transaction.manager_lookup_class
auf die passende Klasse für Ihre server.
Aber ich denke, es ist eine Schande zu haben, das ab der server-spezifische Konfiguration, wie Sie bereits gefunden, den transactionManager im Frühjahr mit <tx:jta-transaction-manager>
.
Gibt es einen Weg, um diese transactionManager Überwintern mit einer Konfiguration wie
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="persistence_unit_name"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.SunONETransactionManagerLookup
</prop>
</props>
</property>
</bean>
<tx:jta-transaction-manager/>
Das Ziel ist, um loszuwerden, das org.hibernate.transaction.SunONETransactionManagerLookup
Eigenschaft.
Übrigens, ich habe wirklich zwei verschiedene server-Implementierungen im Hinterkopf.
EDIT : ohne den Transaktions-manager-Konfiguration, Hibernate drosseln beim erstellen der EntityManagerFactory :
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [file:/C:/configuration/afoCuad-metier-ear/entitymanager-base-context.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: fr.tm.ima.cuad-afoCuad-metier-ejb-PU] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:529)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:495)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:656)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:629)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:338)
... 80 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: fr.tm.ima.cuad-afoCuad-metier-ejb-PU] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:901)
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:308)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
... 93 more
Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:401)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1385)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:892)
... 98 more
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider sucht man in der Hibernate-APIs, wie viele anderen JBoss Produkten, Sie haben eine Klasse in der Regel sogenannte Konfiguration zu halten, die meisten, wenn nicht alle Haupt-config-Sachen. Leider ist es (JBoss) scheint zu halten, "Strings" für die Parameter und die Klasse zu finden-Instanzen. Fast immer ist es oft unmöglich, einfach eine tatsächliche vorgefertigten bereit zu gehen-setup.
Ich bin zu versuchen, etwas ähnlich dem folgenden für die sehr gleichen Grund, den Sie erwähnen.
Zunächst - tun Sie wirklich müssen JTA? Normalerweise spring+hibernate er nicht benötigt wird. Sie können mit einem einfachen
JpaTransactionManager
/HibernateTransactionManager
.Wenn Sie wirklich wollen, JTA, dann müssen Sie eine JTA-Anbieter. Wenn nicht läuft in einem application server, überprüfen Sie diese Frage wie JTA in einem servlet-container. (Werfen Sie auch einen Blick auf diese Frage)
Schließlich hibernate docs festlegen, dass für die container-verwaltete Transaktionen:
Der zweite Punkt ist vielleicht etwas, was Sie verpasst haben?
Was die Dokumentation sagt darüber hinaus zu, dass die (im nächsten Abschnitt) ist, dass, wenn Sie wollen deklarative transaction, hibernate ist nicht, wo Sie suchen sollten, an. Sie würden erstellen müssen, einen interceptor. Das ist genau das, was Frühling Transaktions-Managern sind. Und das wäre meine Wahl bei Ihrem Technologie-stack (Spring).
Wenn Sie möchten, sich an einem einzigen JTA-Anbieter, dann machen die beiden builds. Zum Beispiel maven hat "maven-profile", die es ermöglichen, baut für verschiedene Umgebungen.
Ich habe seit kurzem dabei einige Sachen mit JPA/Grails und die Konfiguration, die ich verwendet wurde entlang dieser Linien:
Wird diese Hilfe überhaupt?