所选的事务策略需要访问JTA TransactionManager或无法构建EntityManagerFactory [英] The chosen transaction strategy requires access to the JTA TransactionManager or Unable to build EntityManagerFactory

查看:205
本文介绍了所选的事务策略需要访问JTA TransactionManager或无法构建EntityManagerFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Apache Tomcat5.5上使用Spring 2.0.6和Hibernate 3.2.x,现在我们计划将我们的hybernate映射文件改为hybernate + jpa支持映射文件。
为我们创建了这样的文件



daoConfig.xml

 < beans:bean id =dataSource
class =org.springframework.jndi.JndiObjectFactoryBean>
< beans:property name =jndiName>
< beans:value> java:/ comp / jdbc / Paymentsdb< / beans:value>
< / beans:property>
< / beans:bean>
< beans:bean id =sessionFactory
class =org.springframework.orm.hibernate3.LocalSessionFactoryBean>
< beans:property name =useTransactionAwareDataSource
value =true/>
< beans:property name =dataSource>
< beans:ref bean =dataSource/>
< / beans:property>
< beans:property name =hibernateProperties>
< beans:道具>
< beans:prop key =hibernate.dialect> $ {database.target}< / beans:prop>
< beans:prop key =hibernate.connection.isolation> 3< / beans:prop>
< beans:prop key =hibernate.current_session_context_class> jta< / beans:prop>
< beans:prop key =hibernate.transaction.factory_class> com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
< / beans:prop>
< beans:prop key =hibernate.transaction.manager_lookup_class> com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
< / beans:prop>
< beans:prop key =hibernate.connection.release_mode> on_close< / beans:prop>
< / beans:道具>
< / beans:property>
< / beans:bean>

< beans:bean id =jpaTemplate
class =org.springframework.orm.jpa.JpaTemplate>
< beans:property name =entityManagerFactory>
< beans:ref bean =entityManagerFactory/>
< / beans:property>
< / beans:bean>

< beans:bean id =entityManagerFactory
class =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
< beans:property name =dataSource>
< beans:ref bean =dataSource/>
< / beans:property>
< beans:property name =jpaVendorAdapter>
< beans:bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
< beans:property name =generateDdlvalue =false/>
< beans:property name =showSqlvalue =true/>
< beans:property name =databasePlatformvalue =$ {database.target}/>
< / beans:bean>
< / beans:property>
< beans:property name =persistenceXmlLocation>
< beans:value> classpath:META-INF / persistence.xml< / beans:value>
< / beans:property>
< / beans:bean>

class =com.atomikos.icatch.jta.UserTransactionManagerinit-method =init
destroy-method = 接近 >
< beans:property name =forceShutdownvalue =true/>
< beans:property name =startupTransactionServicevalue =true/>
< / beans:bean>

< bean:bean id =atomikosUserTransactionclass =com.atomikos.icatch.jta.UserTransactionImp>
< beans:property name =transactionTimeout>
< beans:value> 300< / beans:value>
< / beans:property>
< / beans:bean>

< beans:bean id =transactionManager
class =org.springframework.transaction.jta.JtaTransactionManager>
< beans:property name =transactionManager>
< beans:ref bean =atomikosTransactionManager/>
< / beans:property>
< beans:property name =userTransaction>
< beans:ref bean =atomikosUserTransaction/>
< / beans:property>
< / beans:bean>

< / beans:beans>

在我的daoconfig.xml中,我给出了persistence.xml
的路径,这是我的持久性.xml文件

 <?xml version =1.0encoding =UTF-8?> 
< persistence xmlns =http://java.sun.com/xml/ns/persistence
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation =http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
version = 1.0 >
< persistence-unit name =payhubtransaction-type =JTA>
< provider> org.hibernate.ejb.HibernatePersistence< / provider>
< mapping-file> META-INF / orm.xml< / mapping-file>
< class> com.evolvus.common.model.TaUser< / class>
----------
----------
----------
< class> com.evolvus.common.model.TaBooks< /类>
< / persistence-unit>
< /余辉>

这里我指定了我的orm映射文件名 -
orm.xml文件是

 <?xml version =1.0encoding =UTF-8?> 
< entity-mappings xmlns =http://java.sun.com/xml/ns/persistence/orm
xmlns:xsi =http://www.w3.org/2001 / XMLSchema-instance
xsi:schemaLocation =http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence /orm_1_0.xsd
version =1.0>
< description>欢迎< / description>
< package> com.evolvus.common.model< / package>

<! - TaUser开始 - >
< entity class =com.evolvus.common.model.TaUsername =TaUser>
< table name =ta_user/>
<属性>
< id name =userId>
< column name =USER_ID/>
< generated-value strategy =TABLE/>
< / id>
< basic name =userName>
< column name =USER_NAMElength =50/>
< / basic>
< basic name =password>
< column name =PASS_WORDlength =50/>
< / basic>
< / attributes>
< / entity>
< entity class =com.evolvus.common.model.TaBooksname =TaBooks>
< table name =ta_user/>
<属性>
--------------
--------------
---------- -
< / attributes>
< / entity>
< / entity-mappings>

当我尝试运行我的服务器时.i我收到错误

  org.springframework.beans.factory.BeanCreationException:在ServletContext资源中定义名称为'jpaTemplate'的Bean时创建错误[/WEB-INF/xaconfig/daoJPAConfig.xml ]:设置bean属性'entityManagerFactory'时无法解析对bean'entityManagerFactory'的引用;嵌套异常是org.springframework.beans.factory.BeanCreationException:在ServletContext资源[/WEB-INF/xaconfig/daoJPAConfig.xml]中定义名称为'entityManagerFactory'的bean时出错:init方法的调用失败;嵌套异常是javax.persistence.PersistenceException:[PersistenceUnit:payhub]无法在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
构建EntityManagerFactory
。 springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317
产生的原因:组织.springframework.beans.factory.BeanCreationException:在ServletContext资源[/WEB-INF/xaconfig/daoJPAConfig.xml]中定义名称为'entityManagerFactory'的Bean时创建错误:调用init方法失败;嵌套异常为javax.persistence.PersistenceException:[ PersistenceUnit:payhub]无法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initi上构建EntityManagerFactory
alizeBean(AbstractAutowireCapableBeanFactory.java:1412)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
引起:javax.persistence.PersistenceException:[PersistenceUnit:payhub ]无法在org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)上创建EntityManagerFactory
$ or $ $ b $ org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132)
导致:org.hibernate.HibernateException:所选事务策略需要访问org.hibernate.impl.SessionFactoryImpl上的JTA TransactionManager
。< init>(SessionFactoryImpl.java:329)org
.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
... 42 more

给我任何建议

解决方案

首先,你是肌酸g Hibernate SessionFactory和JPA EntityManagerFactory。除非你有非常奇怪的设置,否则这没什么意义,你应该很可能抛出SessionFactory配置。您可以配置简单的vanilla Hibernate,或者您可以配置JPA,您不需要两者。



创建实体管理器工厂失败,因为您指定了 JTA 作为事务类型,但未定义JTA事务管理器查找类。 (你在Hibernate的SessionFactory配置文件中定义了它,但不是在你的JPA配置文件中定义它。)

把它添加到你的 persistence.xml中

 < persistence-unit name =payhubtransaction-type =JTA> 

...

<属性>
< property name =hibernate.transaction.manager_lookup_class
value =com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup/>
< / properties>
< / persistence-unit>


I am using Spring 2.0.6 and Hibernate 3.2.x on apache tomcat5.5,now we planed to changed our hybernate mapping files into hybernate+jpa support mapping files. for that we created files like this

daoConfig.xml

 <beans:bean id="dataSource" 
  class="org.springframework.jndi.JndiObjectFactoryBean">
      <beans: property name="jndiName">
    <beans: value>java:/comp/jdbc/Paymentsdb</beans:value>  
   </beans: property>
  </beans: bean> 
 <beans: bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <beans: property name="useTransactionAwareDataSource"
   value="true" />
  <beans: property name="dataSource">
   <beans:ref bean="dataSource"/>
  </beans: property>
  <beans: property name="hibernateProperties">
   <beans: props>
    <beans:prop key="hibernate.dialect">${database.target}</beans:prop>
    <beans:prop key="hibernate.connection.isolation">3</beans:prop>
    <beans:prop key="hibernate.current_session_context_class">jta</beans:prop>
    <beans:prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory
    </beans:prop>
    <beans: prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
    </beans: prop>
    <beans: prop key="hibernate.connection.release_mode">on_close</beans: prop>
    <beans: prop key="hibernate.show_sql">false</beans: prop>
   </beans: props>
  </beans: property>
 </beans: bean>

 <beans: bean id="jpaTemplate"
  class="org.springframework.orm.jpa.JpaTemplate">
  <beans: property name="entityManagerFactory">
   <beans:ref bean="entityManagerFactory" />
  </beans: property>
 </beans: bean>

 <beans: bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <beans: property name="dataSource">
    <beans:ref bean="dataSource" />
  </beans: property>    
        <beans: property name="jpaVendorAdapter">
         <beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                        <beans: property name="generateDdl" value="false"/>
                        <beans: property name="showSql" value="true" />
                        <beans: property name="databasePlatform" value="${database.target}" />
                </beans: bean>
        </beans: property>
        <beans: property name="persistenceXmlLocation">
   <beans:value>classpath:META-INF/persistence.xml</beans: value>
  </beans: property>    
    </beans: bean>   

<beans:bean id="atomikosTransactionManager"
    class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
    destroy-method="close">
    <beans:property name="forceShutdown" value="true" />
    <beans:property name="startupTransactionService" value="true" />
</beans:bean>

<beans:bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <beans:property name="transactionTimeout">
        <beans:value>300</beans:value>
    </beans:property>
</beans:bean>

<beans:bean id="transactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
    <beans:property name="transactionManager">
        <beans:ref bean="atomikosTransactionManager" />
    </beans:property>
    <beans:property name="userTransaction">
        <beans:ref bean="atomikosUserTransaction" />
    </beans:property>
</beans:bean>

</beans: beans> 

in my daoconfig.xml i given path for persistence.xml and this is my persistence.xml file

  <?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
 version="1.0">
 <persistence-unit name="payhub" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
         <mapping-file>META-INF/orm.xml</mapping-file>
   <class>com.evolvus.common.model.TaUser</class>
           ----------
           ----------
           ---------- 
    <class>com.evolvus.common.model.TaBooks</class>
    </persistence-unit>
</persistence>

here i am specifying my orm mapping file name
orm.xml file is

 <?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
 version="1.0">
 <description>Welcome</description> 
 <package>com.evolvus.common.model</package>

 <!--  TaUser starts-->
 <entity class="com.evolvus.common.model.TaUser" name="TaUser">
  <table name="ta_user" />
  <attributes>
   <id name="userId">
   <column name="USER_ID"/>
    <generated-value strategy="TABLE" />
   </id>
   <basic name="userName">
    <column name="USER_NAME" length="50" />
   </basic>
   <basic name="password">
    <column name="PASS_WORD" length="50" />
   </basic>
  </attributes>
 </entity>
 <entity class="com.evolvus.common.model.TaBooks" name="TaBooks">
  <table name="ta_user"/>
  <attributes>
    --------------
    --------------
    ------------ 
  </attributes>
 </entity>
  </entity-mappings> 

when i am trying to run my server .i Am getting the error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaTemplate' defined in ServletContext resource [/WEB-INF/xaconfig/daoJPAConfig.xml]: Cannot resolve reference to bean 'entityManagerFactory' while setting bean property 'entityManagerFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/xaconfig/daoJPAConfig.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: payhub] Unable to build EntityManagerFactory
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
 at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/xaconfig/daoJPAConfig.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: payhub] Unable to build EntityManagerFactory
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1412)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
 Caused by: javax.persistence.PersistenceException: [PersistenceUnit: payhub] Unable to build EntityManagerFactory
 at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
 at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132) 
Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
 at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:329)
 at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)  
 ... 42 more 

give me any suggestions

解决方案

First of all, you're creating both a Hibernate SessionFactory and a JPA EntityManagerFactory. That does not make very much sense unless you have a very odd setup, and you should very likely throw out the SessionFactory configuration. You can either configure plain vanilla Hibernate, or you can configure JPA, you don't need both.

The creation of the entity manager factory fails because you specified JTA as the transaction type, but the JTA transaction manager lookup class is not defined. (You defined it in the Hibernate SessionFactory config, but not in your JPA config.)

Add this to your persistence.xml:

<persistence-unit name="payhub" transaction-type="JTA">

    ...

    <properties>
        <property name="hibernate.transaction.manager_lookup_class" 
            value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
    </properties>               
</persistence-unit>

这篇关于所选的事务策略需要访问JTA TransactionManager或无法构建EntityManagerFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆