【问题标题】:Standalone hibernate and narayana JTA standalone platform独立的休眠和 narayana JTA 独立平台
【发布时间】:2016-03-24 00:59:09
【问题描述】:

据我所知,Narayana 应该是一个独立的 JTA 平台实现,可以与 hibernate 一起用于事务管理。

我正在努力建立一个关于如何使用它的简单示例。这是我到目前为止所做的:

<persistence-unit name="trackedTest" transaction-type="JTA">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>pandaa.test.main.MyObject</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.max_fetch_depth" value="30" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform" />

            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/drools" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="" />
        </properties>
    </persistence-unit> 

MyObject 是一个具有 1 个属性的简单对象。

@Entity
@Table(name="testJTA")
public class MyObject {

    @Id
    private String id;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

}

主要是,我试图只保留一个小对象:

public class StandaloneNaranya {


    public static void main(String[] args) throws Exception {


        EntityManagerFactory createEntityManagerFactory = Persistence.createEntityManagerFactory("trackedTest");

        EntityManager em = createEntityManagerFactory.createEntityManager();

        TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();

        MyObject o = new MyObject();
        o.setId("asd");

        tm.begin();

        em.persist(o);
        em.flush();

        tm.commit();

    }
}

然后这告诉我:

INFO: ARJUNA012170: TransactionStatusManager started on port 49231 and host 127.0.0.1 with service com.arjuna.ats.arjuna.recovery.ActionStatusService
Exception in thread "main" javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:993)
    at pandaa.test.main.StandaloneNaranya.main(StandaloneNaranya.java:26)

我不知道如何正确设置它。在容器中运行对我来说不是一个选择。任何帮助都会很棒。

【问题讨论】:

  • 我虽然这就是 tm.begin() 所做的。我不能调用 em.getTransaction().begin() 因为我希望它由 jta 处理
  • 抱歉,我没有注意到那行。如果您在开始事务后创建EntityManager,有什么不同吗?
  • 如果您使用的是 JTA 提供程序,那么您需要获取 UserTransaction 并调用 begin 。你是?我没有看到任何尝试在您的 main() 中获取 JTA 事务
  • 我没有,但是更多的测试告诉我,我需要在 EM 上调用 begin() 然后调用 joinTransaction() 才能使其工作......我不知道为什么,这对我来说毫无意义。 JTA 提供者是什么意思?像 EE 容器?我不使用那个。我希望它是独立的并且尽可能薄(坦率地说,如果 drools 不需要 JTA,我根本不会使用它)。编辑:调试显示,代码中显示的 TM 上的 begin() 将创建一个用户事务,如果没有的话。所以 begin on TM 似乎也委托给了 UserTransaction。

标签: java hibernate jpa transactions jta


【解决方案1】:

这是带有独立 JTA 提供程序的 docs for DataNucleus JPA。我希望在您的 persistence.xml 中看到&lt;jta-data-source&gt; 作为开始。 运行时代码的关键部分是您需要从 JTA 提供程序获取 UserTransaction,类似这样(调整您的 JNDI 以适应您拥有它的位置)

UserTransaction ut = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");

然后

ut.begin();

{your JPA code}

ut.commit();

应该有可能通过任何 JPA 提供程序使用这种风格获得有效的解决方案。该链接中有一个 em.joinTransaction 的示例,具体取决于您何时启动 JTA 事务。

【讨论】:

  • 那里有一些很好的例子对我有帮助。我也设法让它与 narayana 一起工作。我的问题是整个 jndi 查找搞砸了而且不正确,所以内部 jboss 类永远找不到正确的实现。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2012-01-25
相关资源
最近更新 更多