这个问题在这里已有答案:
如何从Spring Boot中的任意bean访问EntityManager?任意我的意思是不是服务或存储库bean . 我试过这个:
public class CriteriaFinder<T extends IdentityOwner> {
// THIS DOES NOT WORKS
@Autowired
@PersistenceContext
private EntityManager em;
public List<T> find(List<QueryParameter> parameters, Class<T> clazz) {
if(em == null)
{
logger.error("Entity manager is null in finder");
return null;
}
...
}
}
我尝试使用/不使用@Autowired和@PersistenceContext注释以及两者 .
(我想使用带有包含的条件查找器来实现自定义查找)
在自定义的@Repository实现中,我可以访问EntityManager:
public class CustomerRepositoryImpl implements CustomerFinderRepository {
// THIS WORKS
@PersistenceContext
private EntityManager em;
...
}
我认为它与Spring发现和初始化bean的方式有关 . 我还想避免使用构造函数或setter传递EntityManager .
1 回答
你可以在任何类中注入
@PersistenceContext
和任何Spring bean,而这个类是一个Spring bean .您有一些绕过此规则的提示 . 例如,通过使用
ApplicationContextAware
但这只应在角落情况下使用 .因此,将
CriteriaFinder
设为Spring bean或将其传递给构造函数中的EntiyManager
as参数 .如果您想在操作
EntiyManager
实例时利用事务管理等Spring功能,建议采用第一种方法 .