【发布时间】:2012-10-25 18:26:39
【问题描述】:
我正在尝试创建一个可以继承的存储库类,以从中获取基本的 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;
}
}
和
公共类 QuestionSqlRepository 扩展 AbstractSqlRepository 实现 QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
}
这是一个不好的方法吗?
【问题讨论】:
-
反射会对性能产生影响。您将不得不尝试查看它是否对您的项目影响太大。好主意!
-
没有那么优雅,你总是可以在构造函数中设置一个 Class
classType 对象。子类构造器只需要调用 super(this.getClass())。它会比使用反射更快,但在开发过程中多了一个步骤。
标签: java jakarta-ee jpa