【问题标题】:not defined a non-jta-data-source in JPA未在 JPA 中定义非 jta 数据源
【发布时间】:2011-02-19 18:51:58
【问题描述】:

我将 JPA 映射到 HSQLDB,persistence.xml 如下所示:

<persistence-unit name="HMC">
  <jta-data-source>java:hmc</jta-data-source>
  <class>org.hmc.jpa.models.BloodGroup</class>
  <class>org.hmc.jpa.models.ContactInfo</class>
  <properties>
    <property 
      name="hibernate.transaction.manager_lookup_class"
      value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
  </properties>
</persistence-unit>

但是每当部署应用程序时,JBoss 都会抛出 RuntimeException 说: Specification violation [EJB3 JPA 6.2.1.2] - You have not defined a non-jta-data-source for a RESOURCE_LOCAL enabled persistence context named: ABC

我还在 JBoss 中定义了数据源。配置中有什么我遗漏的吗?

问候, 萨提亚

【问题讨论】:

    标签: jpa-2.0 jboss5.x hsqldb


    【解决方案1】:
    1. 如果持久单元的事务类型是 JTA,则 jta-datasource 元素用于声明 JTA 的 JNDI 名称 用于获取连接的数据源。这是 常见情况。
    2. 如果持久化单元的事务类型是resource-local, 应该使用非 jta-data-source 来声明一个 JNDI 名称 非 JTA 数据源。

    【讨论】:

      【解决方案2】:

      发生的事情是 JBoss 自动扫描和验证名为 persistence.xml 的文件,因为您使用 spring 来管理您的 bean,我猜您没有使用 EJB3。

      需要了解的是,如果您希望 JBoss 为您控制 JTA 事务,并且您想使用 JBoss Transaction Manager,或者您只想进行 JPA 事务,而不需要 JTA 事务控制。

      如果您只想使用 JPA 事务并跳过 JBoss TransactionManager,您可以将您的 persistence.xml 文件重命名为 spring-persistence.xml(或任何您喜欢的名称),然后在 spring-context.xml 文件中进行更改你的 entityManagerFactory 到这个:

      <!-- JPA primary EntityManagerFactory -->  
            <bean id="entityManagerFactory" lazy-init="true"  
                class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  
                p:persistenceUnitName="ExamplePU"  
                p:persistenceXmlLocation="classpath:/META-INF/spring-persistence.xml"  
                p:jpaVendorAdapter-ref="jpaVendorAdapter"  
                p:jpaDialect-ref="jpaDialect"  
                p:dataSource-ref="dataSource"/> 
      

      发生的情况是,通过重命名文件 JBoss 不会验证它,因为您在 EJB 规范之外工作并且没有使用任何 EJB bean,所以 JBoss 无论如何都不应该扫描这个文件。而且既然你重命名了它,你需要告诉spring它在哪里,用什么名字。

      【讨论】:

        【解决方案3】:

        我通过删除transaction-type="RESOURCE_LOCAL" 并将java:hmc 更改为java:/hmc 使其工作。但是现在每当我尝试坚持时,我的应用程序都会出现另一个问题。

        它抛出:java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()

        谁能告诉我如何在 JTA 模式下获得连接并开始事务?

        问候,

        萨提亚

        【讨论】:

          猜你喜欢
          • 2011-04-14
          • 2017-12-03
          • 1970-01-01
          • 2020-10-28
          • 2015-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-02
          相关资源
          最近更新 更多