如何使用JPA将同一对象持久化到两个不同的db';没有分布式事务?

如何使用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的标识策略,

我希望将相同的实体持久化到MySQL数据库和Postgres数据库(本质上一个是另一个的实时克隆)。从概念上讲,我想用一种方法来实现这一点:

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管理的事务,即使这不是用于生产,也不是特别优雅,如果这有什么根本性的问题,我希望有人指出正确的方法