我正在尝试创建一个可以继承的存储库类,以从中获取基本的 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);
}
}
这是一个不好的方法吗?