2012-10-25 24 views
5

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; 
    } 
} 

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?

+0

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

+0

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

Trả lời

2

Có thể nói rằng sự phản chiếu sẽ bổ sung thêm chi phí nhưng bạn không phải lấy Class của đối tượng mỗi lần theo ý kiến ​​của tôi.

Chỉ cần tìm thấy nó lần đầu tiên và kiểm tra null sau đó, điều này cho biết thêm rất ít chi phí so với gọi một phương pháp siêu lớp.

Đối số duy nhất chống lại tham số hàm tạo là lớp của bạn sẽ không phải là POJO.

Đây là đoạn mã mẫu:

@SuppressWarnings("unchecked") 
public class HibernateBaseDao<T, Pk extends Serializable> implements Dao<Pk, T> { 

    // ... 
    private Class<T> type; 

    // ... 

    public Class<T> getType() { 

     if (this.type == null) { 

      ParameterizedType parameterizedType = (ParameterizedType) (this 
        .getClass().getGenericSuperclass()); 

      while (!(parameterizedType instanceof ParameterizedType)) { 
       parameterizedType = (ParameterizedType) parameterizedType 
         .getClass().getGenericSuperclass(); 
      } 

      this.type = (Class<T>) parameterizedType.getActualTypeArguments()[0]; 

     } 

     return this.type; 
    } 

    @Override 
    public T load(Pk id) { 

     return (T) this.sessionFactory.getCurrentSession().load(this.getType(), 
       id); 
    } 

    @Override 
    public T get(Pk id) { 
     return (T) this.sessionFactory.getCurrentSession().get(this.getType(), 
       id); 
    } 

} 
Các vấn đề liên quan