我正在尝试创建一个存储库类,我可以从中继承以从中获取基本的 CRUD 功能。 EntityManager.find(..) 需要一个 Class 参数。但是,您不能将 T
传递给它(由于某种原因我还不明白......键入删除)。所以我找到了返回实体类的方法,并从我看到的另一个问题中添加了它。首先,它是如何工作的,其次它对性能有多大影响?我看到它使用反射。
@Stateless
public abstract class AbstractSqlRepository<T> implements Repository<T> {
@PersistenceContext
private EntityManager entityManager;
@Override
public void create(T entity) {
entityManager.persist(entity);
}
@Override
public T find(int id) {
return entityManager.find(getEntityClass(), id);
}
@Override
public T update(T entity) {
return entityManager.merge(entity);
}
@Override
public void remove(T entity) {
entityManager.remove(entity);
}
public EntityManager getEntityManager() {
return entityManager;
}
public Class<T> getEntityClass() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
}
新方法:
@Stateless
public abstract class AbstractSqlRepository<T> implements Repository<T> {
@PersistenceContext
private EntityManager entityManager;
private Class<T> clazz;
public AbstractSqlRepository(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public void create(T entity) {
entityManager.persist(entity);
}
@Override
public T find(int id) {
return entityManager.find(clazz, id);
}
@Override
public T update(T entity) {
return entityManager.merge(entity);
}
@Override
public void remove(T entity) {
entityManager.remove(entity);
}
public EntityManager getEntityManager() {
return entityManager;
}
}
和
公共(public)类 QuestionSqlRepository 扩展 AbstractSqlRepository 实现 QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
这是一个糟糕的方法吗?
最佳答案
据说反射会增加开销,但我认为您不必每次都获取对象的类。
只需第一次找到它,然后检查是否为 null,与调用父类(super class)方法相比,这增加的开销非常小。
反对构造函数参数的唯一论据是您的类不会是 POJO。
示例代码如下:
@SuppressWarnings("unchecked")
public class HibernateBaseDao<T, Pk extends Serializable> implements Dao<Pk, T> {
// ...
private Class<T> type;
// ...
public Class<T> getType() {
if (this.type == null) {
ParameterizedType parameterizedType = (ParameterizedType) (this
.getClass().getGenericSuperclass());
while (!(parameterizedType instanceof ParameterizedType)) {
parameterizedType = (ParameterizedType) parameterizedType
.getClass().getGenericSuperclass();
}
this.type = (Class<T>) parameterizedType.getActualTypeArguments()[0];
}
return this.type;
}
@Override
public T load(Pk id) {
return (T) this.sessionFactory.getCurrentSession().load(this.getType(),
id);
}
@Override
public T get(Pk id) {
return (T) this.sessionFactory.getCurrentSession().get(this.getType(),
id);
}
}
关于java - 为 JPA 创建一个我可以继承的通用 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074861/