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 完全不同的方法。唯一通用的通用方法可能是:findById
、findAll
、save
、count
、delete
等
我已经回答了非常相似的问题(大约是Spring,但想法保持不变)。
如果您想了解详细信息,请阅读前面提到的答案。
我有 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 完全不同的方法。唯一通用的通用方法可能是:findById
、findAll
、save
、count
、delete
等
我已经回答了非常相似的问题
如果您想了解详细信息,请阅读前面提到的答案。