CDI JPA Generic Dao

时间:2016-01-14 14:55:36

标签: java cdi

我有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类。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

不要这样做。

创建和注入通用DAO 是一种好的(也不是简单的,由于type erasure)方式。你可能会问&#34;为什么?&#34;。因为每个DAO几乎总是与其他DAO完全不同的方法。唯一通用的通用方法可能是:findByIdfindAllsavecountdelete等。

我已经回答了非常类似的问题here(这是关于Spring,但想法仍然相同)。

如果您需要详细信息,请阅读前面提到的答案。