我想在一個新項目中重用我的AbstractDAO,但這次我不想使用EJB註釋 - 只是CDI的。如何將我的DAO Bean從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註釋。但是,簡單地用一個@RequestScoped更換也不會因爲不帶參數的非私有構造器的工作的要求JSR-346
我如何修改我的DAO到純CDI一個?
'UserDAO'有一個無參數的非私有構造函數。而'@ PersistenceContext'將在JEE環境*中用於CDI bean *。我沒有得到正確的問題嗎?你真的嘗試過使用'UserDAO'' @ RequestScoped'嗎?錯誤是什麼? –
只是好奇 - 你想通過這樣做達到什麼目的? –
我發現CDI和EJB bean的混合讓很多人感到困惑(至少在我的最後一個項目中)。另外,我讀了這個:http://theelitegentleman.blogspot.de/2014/04/daos-as-ejbs-you-are-doing-it-wrong.html – Tim