【发布时间】:2015-10-28 16:30:00
【问题描述】:
Employee employee = entityManager.find(Employee.class, 1L);
if (employee == null) {
throw new EntityNotFoundException();
}
由于EntityManager#find()返回null,以防上述实体不可用,因此需要如上所示的条件测试来避免可能的java.lang.NullPointerException,否则很可能。在任何地方重复这种琐碎的条件测试是非常不可接受和不鼓励的,这使得业务逻辑应该尽可能简单,几乎不可读。
为了防止这种条件检查在所有地方重复,我在单独的 EJB 中有一个通用方法,就像这样,
@Stateless
public class EntityManagerUtils implements EntityManagerService {
@PersistenceContext
private EntityManager entityManager;
@Override
public <T extends Object> T find(Class<T> entityClass, Object primaryKey) {
T entity = entityManager.find(entityClass, primaryKey);
if (entity == null) {
throw new EntityNotFoundException();
}
return entity;
}
}
从另一个 EJB 内部调用此方法,如下所示,
@Stateless
public class TestBean implements TestBeanService {
@PersistenceContext
private EntityManager entityManager;
@Inject
private EntityManagerService entityManagerService;
@Override
public void test(Employee employee) {
Department managedDepartment = entityManagerService.find(Department.class, employee.getDepartment().getDepartmentId());
System.out.println("contains : " + entityManager.contains(managedDepartment));
}
}
在这里,尽管所有事情都发生在同一个事务中,entityManager.contains(managedDepartment) 返回 true,即返回的 Department 实体由两个 EJB 中的 EntityManagers 管理。
虽然是意料之中,但entityManager.contains(managedDepartment)如何返回true?
是否是相同的EntityManager 实例使用相同的EntityManagerFactory?
【问题讨论】:
-
像 EJB 一样,它们也是代理(指与当前事务关联的代理)
标签: hibernate jpa ejb eclipselink entitymanager