未在 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 数据源的主要内容,如果未能解决你的问题,请参考以下文章