如何在另一个事务中提交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被忽略以刷新实体更改。