如何在JTA EntityManager中启动事务

时间:2011-02-19 08:34:52

标签: jpa jboss5.x hsqldb

我有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>

并将EntityManager作为: entManagerFactory = Persistence.createEntityManagerFactory("HMC");

我的JBoss5.1中也为hsqldb定义了数据源。如果我开始事务,它会抛出IllegalStateException:JTA EntityManager不能使用getTransaction()

在这种情况下,有人可以让我知道如何开始和提交交易。

此致

萨蒂亚

2 个答案:

答案 0 :(得分:2)

这是getTransaction的javadoc所说的......

EntityTransaction getTransaction()

Return the resource-level EntityTransaction object. The EntityTransaction instance may be used serially to begin and commit multiple transactions.

Returns:
    EntityTransaction instance 
Throws:
    IllegalStateException - if invoked on a JTA entity manager

所以基本上它意味着如果transaction-type属性是带有jdbc XA数据源的JTA,那么你会得到一个IllegalStateException。

建议修复:尝试使用localTx jdbc数据源将transaction-type设置为resource-local,否则将导致IllegalStateException。

答案 1 :(得分:1)

最后,我可以通过更改行来处理这个问题:

<persistence-unit name="HMC" transaction-type="RESOURCE_LOCAL">