问题描述
我在 Java EJB
类中有以下代码,它调用另一个服务类并将 entityManager
作为参数传递:
AppointmentService EJB:
try {
entityManager = entityManagement.createEntityManager(client);
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Appointment> query = builder.createquery(Appointment.class);
Root<Appointment> from = query.from(Appointment.class);
CriteriaQuery<Appointment> selectQuery = query.select(from);
searchService.searchByKeywords(searchRequest,searchResults,entityManager,selectQuery,keywordPredicates);
} catch (Exception e) {
}
SearchService EJB:
public List<Appointment> searchByKeywords(AppointmentSearchRequest searchRequest,List<Appointment> searchResults,EntityManager entityManager,CriteriaQuery<Appointment> selectQuery,Optional<List<Predicate>> keywordPredicates) {
Map<Integer,Appointment> uniqueSearchResults = new HashMap<>();
if(keywordPredicates.isPresent()){
for (Predicate singlePredicate : keywordPredicates.get()) {
selectQuery = selectQuery.where(singlePredicate);
List<Appointment> singleQueryResults = entityManager.createquery(selectQuery).setFirstResult(searchRequest.getIndex()).setMaxResults(searchRequest.getSize()).getResultList();
searchResults.addAll(singleQueryResults);
}
}
return searchResults;
}
在 EJB 类之间传递 entityManager
、selectQuery
是最佳做法,还是应该在 SearchService EJB
中实例化 entityManager?
解决方法
最佳实践是在任何需要它的 EJB 中注入 entityManager
。
@PersistenceContext
private EntityManager entityManager;
容器将搜索 persistence.xml
文件,并将实体管理器注入您的 EJB。
您可以指定不同的持久化单元,使用 unitName
:
@PersistenceContext(unitName = "unitName")
private EntityManager entityManager;
实体管理器的范围与事务相关联,因此参与同一事务的每个 EJB 都将注入相同的 entityManager
。