如何使用JPA将同一对象持久化到两个不同的db';没有分布式事务?
我希望将相同的实体持久化到MySQL数据库和Postgres数据库(本质上一个是另一个的实时克隆)。从概念上讲,我想用一种方法来实现这一点:如何使用JPA将同一对象持久化到两个不同的db';没有分布式事务?,jpa,eclipselink,jta,glassfish-4,Jpa,Eclipselink,Jta,Glassfish 4,我希望将相同的实体持久化到MySQL数据库和Postgres数据库(本质上一个是另一个的实时克隆)。从概念上讲,我想用一种方法来实现这一点: EntityManager mysql = ...; EntityManager postgres = ...; MyEntity e = new MyEntity(); e.setStuff(); mysql.persist(e); postgres.persist(e); MyEntity类为其@Id字段指定@GeneratedValue的标识策略,
EntityManager mysql = ...;
EntityManager postgres = ...;
MyEntity e = new MyEntity();
e.setStuff();
mysql.persist(e);
postgres.persist(e);
MyEntity
类为其@Id
字段指定@GeneratedValue
的标识策略,这两个数据源是非XA数据源
JPA/JTA似乎希望在分布式事务中做到这一点,我认为这是由于容器管理事务的事务边界是如何确定的,我得到一个错误,因为数据源不是XA。我可以将数据源定义为XA源,这样上面的内容就可以作为一个分布式事务来使用,但对于眼前的需要,这确实是不必要的。我真的不在乎这两者是否在同一个事务中——事实上,如果一个失败,另一个成功,也没关系(至少目前如此)
有没有办法将同一对象持久化到具有非XA数据源的多个数据库,并且仍然使用容器管理的事务?相关的,如果我想在一个方法中对多个对象和多个数据源进行一系列持久化,有没有办法对非XA数据源进行持久化?我将EclipseLink与GlassFish 4.0一起使用。嗯,我没有发现如何使用容器管理的事务,但使用bean管理的事务。注入UserTransaction资源,并在开始/提交对之间包装每个persist:
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyClass
{
@Resource private UserTransaction utx;
public void doStuff()
{
EntityManager mysql = ...;
EntityManager postgres = ...;
MyEntity e = new MyEntity();
e.setStuff();
try {
utx.begin();
mysql.persist(e);
utx.commit();
utx.begin();
postgres.persist(e);
utx.end();
} catch (...) {
...
}
}
}
我以前从未尝试过使用bean管理的事务,即使这不是用于生产,也不是特别优雅,如果这有什么根本性的问题,我希望有人指出正确的方法