Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 独立hibernate和narayana JTA独立平台_Java_Hibernate_Jpa_Transactions_Jta - Fatal编程技术网

Java 独立hibernate和narayana JTA独立平台

Java 独立hibernate和narayana JTA独立平台,java,hibernate,jpa,transactions,jta,Java,Hibernate,Jpa,Transactions,Jta,据我所知,Narayana应该是一个独立的JTA平台实现,可以与hibernate一起用于事务管理 我正在努力建立一个简单的例子来说明如何使用它。以下是我到目前为止所做的: <persistence-unit name="trackedTest" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <cl

据我所知,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> 
总的来说,我试着只保留一个小对象:

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提供程序的示例。首先,我希望在persistence.xml中看到一个
。 运行时代码的关键部分是您需要从JTA提供程序获取UserTransaction,类似这样的内容(调整JNDI以适应您拥有它的地方)

然后

ut.begin();

{your JPA code}

ut.commit();

应该有可能得到一个工作的解决方案,使用这种风格与任何JPA供应商。该链接中有一个
em.joinTransaction
的示例,具体取决于您何时启动JTA事务。

I尽管tm.begin()就是这样做的。我不能调用em.getTransaction().begin(),因为我希望它由jtaSorry处理,我没有注意到这一行。如果在启动事务后创建
EntityManager
,会有什么不同吗?如果您使用的是JTA提供商,则需要获取UserTransaction并调用begin。你是吗?我没有看到任何试图在main()中获取JTA事务的尝试,我没有,但是更多的测试表明,我需要调用begin()然后在EM上调用joinTransaction(),这样才能工作。。。我不知道为什么,这对我来说毫无意义。你所说的JTA提供商是什么意思?像一个EE容器?我不用那个。我希望它是独立的,并且尽可能薄(坦白地说,如果drools不需要JTA,我根本不会使用它)。Edit:Debug显示,如果没有,则代码中所示的TM上的begin()将创建usertransaction。所以begin on TM似乎也在委托给UserTransaction。其中一些很好的例子对我很有帮助。我也设法让它和纳拉亚娜一起工作。我的问题是整个jndi查找都是混乱和不正确的,因此内部jboss类永远无法找到正确的实现。谢谢
UserTransaction ut = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
ut.begin();

{your JPA code}

ut.commit();