基本的な 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 class QuestionSqlRepository extends AbstractSqlRepository implement QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
}
これは悪いアプローチですか?