首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >独立hibernate和narayana JTA独立平台

独立hibernate和narayana JTA独立平台
EN

Stack Overflow用户
提问于 2015-12-17 14:09:38
回答 1查看 1.3K关注 0票数 2

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

我正在努力建立一个简单的例子来说明如何使用它。我到目前为止所做的事情如下:

代码语言:javascript
复制
<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属性的简单对象。

代码语言:javascript
复制
@Entity
@Table(name="testJTA")
public class MyObject {

    @Id
    private String id;

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

    public String getId() {
        return id;
    }

}

总的来说,我只想坚持一个小对象:

代码语言:javascript
复制
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();

    }
}

这就告诉我:

代码语言:javascript
复制
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)

我不知道如何正确地设置这件事。在容器中运行对我来说不是一种选择。任何帮助都会很好。

EN

回答 1

Stack Overflow用户

发布于 2015-12-17 16:17:19

以下是具有独立JTA提供程序的DataNucleus JPA文档。我希望在您的persistence.xml中看到一个persistence.xml作为开始。运行时代码的关键部分是您需要从JTA获得UserTransaction,类似于这样的内容(调整您的JNDI以适应有它的地方)

代码语言:javascript
复制
UserTransaction ut = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");

然后

代码语言:javascript
复制
ut.begin();

{your JPA code}

ut.commit();

应该有可能在任何JPA提供程序中使用这种样式来获得一个有效的解决方案。在该链接中有一个em.joinTransaction示例,它依赖于启动JTA事务的时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34336616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档