【发布时间】:2017-05-30 17:09:59
【问题描述】:
我想在一个新项目中重用我的 AbstractDAO,但这次我不想使用 EJB 注释 - 只是 CDI 注释。
到目前为止,我一直是这样使用它的:
public abstract class AbstractDAO<T> {
@PersistenceContext(unitName = "myUnit")
private EntityManager entityManager;
private Class<T> entityClass;
public AbstractDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected EntityManager getEntityManager() {
return entityManager;
}
public void save(T entity) {
entityManager.persist(entity);
}
public void update(T entity) {
entityManager.merge(entity);
}
public void remove(T entity) {
entityManager.remove(entityManager.merge(entity));
}
public T findById(Object id) {
return entityManager.find(entityClass, id);
}
public List<T> findBy(String attrName, Object attrValue) {
// Impl here
}
// [...] Many more search methods
}
我一直在为每个实体创建一个 DAO,例如:
@Stateless
public class UserDAO extends AbstractDAO<User> {
public UserDAO() {
super(User.class);
}
public User findByUsername(String username) {
if (username != null) {
return super.findOneBy("username", username.toLowerCase());
}
return null;
}
}
现在我想摆脱@Stateless 注释。但是由于 JSR-346
的 non-private constructor with no parameters 要求,简单地用 @RequestScoped 替换它是行不通的如何将我的 DAO 重构为纯 CDI 的?
【问题讨论】:
-
UserDAO有一个无参数、非私有的构造函数。@PersistenceContext将适用于 JEE 环境中的 CDI bean。我没有解决问题吗?你真的试过制作UserDAO@RequestScoped吗?错误是什么? -
只是好奇 - 你这样做是为了达到什么目的?
-
我发现 CDI 和 EJB bean 的混合让很多人感到困惑(至少在我的上一个项目中是这样)。另外,我读到这个:theelitegentleman.blogspot.de/2014/04/…
-
实际的警告是“Type AbstractDAO
(带有不带参数的非私有构造函数)不是普通作用域 bean UserDAO 的合法类型,因为它不能被容器代理 [ JSR-346 §3.15]" -
你真的需要自己实现 DAO,为什么不看看像 DeltaSpike Data 这样的库,它用所有标准方法实现了 DAO。
标签: jpa jakarta-ee cdi