CD IJ PA generic DAO

CDI JPA Generic Dao

我有 BaseEntity class。

@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 class,它扩展了 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 java class,而是想使用此注释在注入点动态创建指定的 dao。

@Inject
@Dao
private GenericDao<Role, Long> roleDao;

我想为 roleDao 即时生成应用程序范围的 bean。为此,我创建了 GenericDao class.

public class GenericDao<T extends BaseEntity, ID extends Serializable> extends GenericBaseDao<T, ID> {
}

有人可以解释如何生成 genericDao 并且应该在 applicationscoped 中而不是从属的。这是创建通用 dao 而不是创建我自己的 Dao 的最佳实践 java class.

感谢任何帮助!

不要这样做。

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

我已经回答了非常相似的问题(大约是Spring,但想法保持不变)。

如果您想了解详细信息,请阅读前面提到的答案。