共享 EntityManager 上下文中使用的事务的范围是什么?
What is the scope of a Transaction used in shared EntityManager contexts?
在 JPA 中:
考虑以下示例,它使用容器管理的事务范围内的实体管理器。
public class ItemDAOImpl implements ItemDAO {
@PersistenceContext(unitName="ItemService")
EntityManager em;
LoggingService ls;
public void createItem(Item item) {
em.persist(item);
ls.log(item.getId(), "created item");
}
// ...
}
public class LoggingService implements AuditService {
@PersistenceContext(unitName="ItemService")
EntityManager em;
public void log(int itemId, String action) {
// verify item id is valid
if (em.find(Item.class, itemId) == null) {
throw new IllegalArgumentException("Unknown item id");
}
LogRecord lr = new LogRecord(itemId, action);
em.persist(lr);
}
}
我假设 ls.log()
方法是否正确
将使用调用方法的事务。
我现在对这些事情很困惑,你能帮忙吗?
如果您在 EJB 中,那么这些方法很可能会使用相同的事务,因为 default transaction propagation 方法。只需检查它们的配置方式,因为它们似乎是在 XML 文件中配置的。
在 JPA 中: 考虑以下示例,它使用容器管理的事务范围内的实体管理器。
public class ItemDAOImpl implements ItemDAO {
@PersistenceContext(unitName="ItemService")
EntityManager em;
LoggingService ls;
public void createItem(Item item) {
em.persist(item);
ls.log(item.getId(), "created item");
}
// ...
}
public class LoggingService implements AuditService {
@PersistenceContext(unitName="ItemService")
EntityManager em;
public void log(int itemId, String action) {
// verify item id is valid
if (em.find(Item.class, itemId) == null) {
throw new IllegalArgumentException("Unknown item id");
}
LogRecord lr = new LogRecord(itemId, action);
em.persist(lr);
}
}
我假设 ls.log()
方法是否正确
将使用调用方法的事务。
我现在对这些事情很困惑,你能帮忙吗?
如果您在 EJB 中,那么这些方法很可能会使用相同的事务,因为 default transaction propagation 方法。只需检查它们的配置方式,因为它们似乎是在 XML 文件中配置的。