据我所知,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)
我不知道如何正确设置。在容器中运行对我来说不是一个选择。任何帮助都会很棒。
答案 0 :(得分:1)
这是带有独立JTA提供程序的docs for DataNucleus JPA。我希望在 persistence.xml 中看到<jta-data-source>
作为开头。
运行时代码的关键部分是你需要从JTA提供程序获取UserTransaction,这样的事情(使你的JNDI适应你拥有它的地方)
UserTransaction ut = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
然后
ut.begin();
{your JPA code}
ut.commit();
应该可以使用任何JPA提供商使用此样式获得有效的解决方案。该链接中有em.joinTransaction
的示例取决于您何时启动JTA事务。