未在 JPA 中定义非 jta 数据源

Posted

技术标签:

【中文标题】未在 JPA 中定义非 jta 数据源【英文标题】:not defined a non-jta-data-source in JPA 【发布时间】: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 中定义了数据源。配置中有什么我遗漏的吗?

问候, 萨提亚

【问题讨论】:

【参考方案1】:
    如果持久单元的事务类型是 JTA,则 jta-datasource 元素用于声明 JTA 的 JNDI 名称 用于获取连接的数据源。这是 常见情况。 如果持久化单元的事务类型是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 模式下获得连接并开始事务?

问候,

萨提亚

【讨论】:

以上是关于未在 JPA 中定义非 jta 数据源的主要内容,如果未能解决你的问题,请参考以下文章

Spring/JTA/JPA DAO 集成测试不回滚?

数据源、XADataSource 和 JTA

JPAJTA与JMS

jpa 实体bean中如何定义非映射字段

JPA 未在 WildFly 16 上保存到数据库

JPA 查询未在列表中返回更新的结果