独立休眠和纳拉亚纳JTA独立平台



我所知,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)

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

这是带有独立 JTA 提供程序的 DataNucleus JPA 的文档。我希望看到你的坚持<jta-data-source>.xml作为一个开始。运行时代码的关键部分是你需要从 JTA 提供程序获取 UserTransaction,如下所示(调整你的 JNDI 以适应你拥有它的位置(

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

然后

ut.begin();
{your JPA code}
ut.commit();

应该可以在任何 JPA 提供程序中使用这种样式获得工作解决方案。该链接中有一个em.joinTransaction示例,具体取决于您启动 JTA 事务的时间。

最新更新