我有BaseEntity类。
@MappedSuperclass
public class BaseEntity {
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
我有Dao界面。
public interface IBaseDao<T extends BaseEntity, ID extends Serializable> {
T persist(T entity);
}
我有AbstractDao实现了IBaseDao。
public abstract class GenericBaseDao<T extends BaseEntity, ID extends Serializable> implements IBaseDao<T, ID> {
public T persist(T entity) {
getEntityManager().persist(entity);
return entity;
}
}
我可以编写自己的自定义dao类,它扩展了GenericBaseDao并将其标记为@ApplicationScoped。
public interface IRoleDao extends IBaseDao<Role, Long> {
}
@ApplicationScoped
@Named
public class RoleDaoImpl extends GenericBaseDao<Role, Long> implements IUserDao {
}
一切正常。
我有dao注释
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE })
public @interface Dao {
}
我想使用这个注释来动态地在注入点创建指定的dao,而不是创建dao java类。
@Inject
@Dao
private GenericDao<Role, Long> roleDao;
我想动态地为roleDao生成应用程序作用域bean。为此,我创建了GenericDao类。
public class GenericDao<T extends BaseEntity, ID extends Serializable> extends GenericBaseDao<T, ID> {
}
有人可以解释如何生成genericDao并且应该在applicationcoped中不依赖。这是创建泛型dao的最佳实践,而不是创建我自己的Dao java类。
任何帮助表示赞赏!
答案 0 :(得分:1)
不要这样做。
创建和注入通用DAO 不是一种好的(也不是简单的,由于type erasure
)方式。你可能会问&#34;为什么?&#34;。因为每个DAO几乎总是与其他DAO完全不同的方法。唯一通用的通用方法可能是:findById
,findAll
,save
,count
,delete
等。
我已经回答了非常类似的问题here(这是关于Spring,但想法仍然相同)。
如果您需要详细信息,请阅读前面提到的答案。