【发布时间】:2014-05-14 14:01:08
【问题描述】:
我有这样的代码:
public void createTerminal(TerminalDo terminalDo) {
final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
final EntityManager em = emf.createEntityManager();
EntityTransaction etx = null;
try {
etx = em.getTransaction();
etx.begin();
// persist method make the passed Object stored in the persistence
// context
em.persist(terminalDo);
etx.commit();
} catch (Exception e) {
if (etx != null && etx.isActive())
etx.rollback();
e.printStackTrace();
} finally {
em.close();
}
}
这是一种事务方法。 我不知道是否可以创建另一个事务方法调用这个已经事务的方法, 然后将实体管理的事务嵌套到另一个事务中, 这是一个好习惯吗?
public void makeAllThat(TerminalDo terminalDo, ApplicationDo applicationDo) {
final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
final EntityManager em = emf.createEntityManager();
EntityTransaction etx = null;
try {
etx = em.getTransaction();
etx.begin();
createTerminal(terminalDo);
createApplication(applicationDo);
//do many other transactions...
.....
etx.commit();
} catch (Exception e) {
if (etx != null && etx.isActive())
etx.rollback();
e.printStackTrace();
} finally {
em.close();
}
}
【问题讨论】:
-
我认为你想在 JPA 中实现所谓的事务传播。
-
这正是我想要的。是否可以使用 JPA 进行“事务传播”,还是只能使用 Spring ?或者也许是 CDI ?
-
抱歉回复晚了。从 JPA 的角度来看,事务传播 术语是指在单个 JTA 事务内的多个容器管理的实体管理器(事务范围或扩展)之间共享单个持久性上下文。仔细查看
@TransactionAttribute(EJB) 或@Transactional(Spring) 并选择适合您的。
标签: jpa transactions entitymanager