Tôi đang cố gắng tạo một lớp lưu trữ mà tôi có thể kế thừa từ để có được chức năng CRUD cơ bản từ đó. EntityManager.find (..) cần một đối số Class. Tuy nhiên, bạn không thể vượt qua T
cho nó (Bởi một số lý do tôi chưa hiểu ... loại xóa). Vì vậy, tôi đã tìm thấy phương thức trả về lớp thực thể và thêm nó từ một câu hỏi khác mà tôi đã thấy. Trước hết, làm thế nào nó hoạt động và thứ hai nó sẽ có tác động nhiều đến performace? Tôi thấy nó sử dụng sự phản chiếu.Tạo một DAO chung cho JPA mà tôi có thể kế thừa 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];
}
}
Cách tiếp cận mới:
@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;
}
}
và
public class QuestionSqlRepository kéo dài AbstractSqlRepository thực hiện QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
}
Đây có phải là phương pháp không tốt?
phản ánh sẽ có ảnh hưởng đến hiệu suất. Bạn sẽ phải cố gắng để xem nếu nó ảnh hưởng đến dự án của bạn quá nhiều. Ý tưởng tốt đẹp mặc dù! – RNJ
Không hoàn toàn thanh lịch, bạn luôn có thể có đối tượng lớp Class được đặt trong hàm tạo. Lớp con constructur chỉ cần gọi super (this.getClass()). Nó sẽ nhanh hơn việc sử dụng sự phản chiếu, nhưng là một bước bổ sung trong phát triển. –
JustinKSU