Próbuję utworzyć klasę repozytorium, z której mogę dziedziczyć, aby uzyskać podstawową funkcjonalność CRUD. EntityManager.find (..) potrzebuje argumentu Class. Jednak nie możesz przekazać do niego T
(Z jakiegoś powodu nie rozumiem jeszcze ... typ wymazania). Tak więc znalazłem metodę, która zwraca klasę encji i dodała ją z innego pytania, które zobaczyłem. Po pierwsze, jak to działa, a po drugie czy ma duży wpływ na performance? Widzę, że używa refleksji.Tworzenie ogólnego DAO dla JPA, które można dziedziczyć po
@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];
}
}
Nowe podejście:
@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;
}
}
i
public class QuestionSqlRepository rozciąga AbstractSqlRepository realizuje QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
}
Czy to złe podejście?
odbicie będzie mieć wpływ na wydajność. Musiałbyś spróbować sprawdzić, czy wpłynęło to zbytnio na twój projekt. Fajny pomysł! – RNJ
Nie tak elegancko, jak zawsze można mieć obiekt classType klasy, który jest ustawiony w konstruktorze. Konstruktor podklasy musiałby po prostu wywołać super (this.getClass()). Byłoby to szybsze niż użycie refleksji, ale dodatkowy krok w rozwoju. –
JustinKSU