【问题标题】:How to start Transaction in JTA EntityManager如何在 JTA EntityManager 中启动事务
【发布时间】:2011-06-30 07:16:39
【问题描述】:

我将 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 : A JTA EntityManager cannot use getTransaction()

谁能告诉我在这种情况下如何开始和提交交易。

问候,

萨提亚

【问题讨论】:

    标签: jpa jboss5.x hsqldb


    【解决方案1】:

    这就是 getTransaction 的 javadocs 所说的......

    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
    

    所以基本上这意味着如果事务类型属性是带有 jdbc XA 数据源的 JTA,那么你会得到一个 IllegalStateException。

    建议的修复:尝试使用 localTx jdbc 数据源将事务类型设置为资源本地,否则会导致 IllegalStateException。

    【讨论】:

      【解决方案2】:

      最后我可以通过换行来解决这个问题:

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

      【讨论】:

        猜你喜欢
        • 2012-06-28
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 2012-05-24
        • 2014-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多