首页 > 解决方案 > 如何使用 QueryDsl 正确创建 JPAQueryFactory

问题描述

我听说EntityManageris not thread-safe,所以我们使用@PersistenceContext而不是@Autowired.

但是,我在网上找到了两种创建 JPAQueryFactory 的方法。

  1. 像这样定义一个bean
@Configuration
public class JPAQueryFactoryConfiguration {
    
    @Bean
    public JPAQueryFactory jpaQueryFactory(@Autowired EntityManager entityManager) {
        return new JPAQueryFactory(entityManager);
    }
}
  1. @PersistenceContext on EntityManager ,每次都新建 JPAQueryFactory(entityManager)
@Service
public class TestServiceImpl implements TestService {
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void test(){
        JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(entityManager);
        xxxxxxxxxxxx
    }
}

我很困惑。但是,根据@PersistenceContext 和@Autowired 之间的区别,我认为第一种方法是不正确的

标签: javaspringjpaquerydsl

解决方案


我只是在 EJB 中比较大,JPAQueryFactory 的类型是 Provider 不是 EntityManager,只是 Cast

JPAQueryFactory query = new JPAQueryFactory((Provider<EntityManager>) em);

或者使用 JPAQueryFactory 的声明

EntityManagerFactory emf = 
  Persistence.createEntityManagerFactory("com.baeldung.querydsl.intro");
EntityManager em = entityManagerFactory.createEntityManager();
JPAQueryFactory queryFactory = new JPAQueryFactory(em);

推荐阅读