在 EJB 类之间传递 EntityManager?

问题描述

我在 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 类之间传递 entityManagerselectQuery 是最佳做法,还是应该在 SearchService EJB 中实例化 entityManager?

解决方法

最佳实践是在任何需要它的 EJB 中注入 entityManager

@PersistenceContext
private EntityManager entityManager;

容器将搜索 persistence.xml 文件,并将实体管理器注入您的 EJB。

您可以指定不同的持久化单元,使用 unitName:

@PersistenceContext(unitName = "unitName")
private EntityManager entityManager;

实体管理器的范围与事务相关联,因此参与同一事务的每个 EJB 都将注入相同的 entityManager

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...