gpt4 book ai didi

java - 为 JPA 创建一个我可以继承的通用 DAO

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:41 24 4
gpt4 key购买 nike

我正在尝试创建一个存储库类,我可以从中继承以从中获取基本的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com