如何在另一个事务中提交JPA实体

如何在另一个事务中提交JPA实体,jpa,ejb,Jpa,Ejb,我有以下实体: @Entity public class Entity1 { @Id private Long id; private String name; private String state; @Version private Long version; ... getter and setter } 以及用于impl业务的多EJB: @Stateless public class EntityDao{ @Persi

我有以下实体:

@Entity
public class Entity1
{
    @Id
    private Long id;
    private String name;
    private String state;

    @Version
    private Long version;
    ... getter and setter
}
以及用于impl业务的多EJB:

@Stateless
public class EntityDao{
    @PersistenceContext(unitName="")
    private EntityManager em;

    @TransactionAttribute(REQUIRES_NEW)
    public void createEntity1(Entity1 e)
    {
        e.status = "start";
        em.persist(e);
    }

    @TransactionAttribute(REQUIRES_NEW)
    public void changeToTimeout(Entity1 e)
    {
        e.status = "timeout";
        em.merge(e);
    }
}

@Stateless
public class MyService
{

    @EJB
    EntityDao dao;

    @EJB
    MyService2 ms2;

    @PersistenceContext(unitName="")
    private EntityManager em;

    public void doWork()
    {
       Entity1 e = new Entity1();
       dao.createEntity1(e);
       e = em.find(Entity1.class, e.getId());
       em.refresh(e);
       ms2.handle(e);
    }
}

@Stateless
public class MyService2
{
    @EJB
    EntityDao dao;

    public void handle(Entity1 e)
    {
       e.name = "M";
       dao.changeToTimeout(e);
... and other statement that effected on e object
    }
 }
在这种状态下,如果在调用dao.changeToTimeout()之前,对象版本发生了更改并增加,我会得到OptimisticException,如果在changeToTimeout()中首先找到了对象,然后更改了状态字段,则会忽略另一个事务中的更改,因为该事务不知道另一个事务JPA上下文


是否有连接两个JPA上下文的方法?

将事务属性类型更改为必需

@TransactionAttribute(TransactionAttributeType.REQUIRED)
它将加入客户端事务上下文


现在您有“
REQUIRES\u NEW
”,意味着始终从新的事务上下文开始。

我需要新的事务,如果第一个事务回滚,实体状态将更改为超时。您是否尝试过在
changettimeout
方法中执行
em.refresh(e)
?在更改状态之前,我设置entityManager.setFlushMode(FlushModeType.COMMIT);然后,因为同步的默认值是SynchronizationType.SYNCHRONIZED,所以我将entitymanager发送到新事务,并将我的实体合并到它。在提交第二个事务后,在第一个事务中,合并实体并将其分离,然后再次合并。在这项工作中,JPA被忽略以刷新实体更改。