본문 바로가기

JavaFX

JavaFX + Hibernate 제네릭 CRUD 인터페이스 구현하기

JavaFX + Hibernate 제네릭 CRUD 와 DAO 구현

 

 

GenericHibernateDAO 구현

 

클라이언트가 DAO 를 사용하기 전에 Session을 설정하지 않았으면 DAO 코드에서 Session이 필요할 때 Session을 가져온다.

public abstract class GenericHibernateDAO<T, ID extends Serializable> implements GenericDAO<T, ID>{
  private Session session;
  private final Class<T> persistentClass;
  
  @SuppressWarnings("unchecked")
  public GenericHibernateDAO(){
    this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  }
  
  public void setSession(Session session){
    this.session = session;
  }
  
  protected Session getSession(){
    if(session == null){
      session = HibernateUtil.getSessionFactory().openSession();
    }
    
    return session;
  }
  
  public Class<T> getPersistentClass(){
    return persistentClass;
  }
  
  // 하이버네이트 실제 CRUE 기능 구현
  @SuppressWarnings("unchecked")
  public T findById(ID id, boolean lock){
    T entity;
    if(lock)
    	entity = (T) getSession().load(getPersistentClass(), id, LockMode.UPGRADE);
    else
    	entity = (T) getSession().load(getPersistentClass(), id);
        
    return entity;
  }
  
  @SuppressWarnings("unchecked")
  public List<T> findAll(){
    return findByCriteria();
  }
  
  @SuppressWarnings("unchecked")
  public List<T> findByExample(T exampleInstance, String... excludeProperty){
    Criteria crit = getSession().createCriteria(getPersistentClass());
    Example example = Example.create(exampleInstance);
    for(String exclude : excludeProperty){
      example.excludeProperty(exclude);
    }
    
    crit.add(example);
    
    return crit.list();
  }
  
  @SuppressWarnings("unchecked")
  public T makePersistent(T entity){
    getSession().saveOrUpdate(entity);
    return entity;
  }
  
  public void makeTransient(T entity){
    getSession().delete(entity);
  }
  
  public void flush(){
    getSession().flush();
  }
  
  public void clear(){
    getSession().clear();
  }
  
  @SuppressWarnings("unchecked")
  protected List<T> findByCriteria(Criterion... criterion){
    Criteria crit = getSession().createCriteria(getPersistentClass());
    for(Criterion c: criterion){
      crit.add(c);
    }
    
    return crit.list();
  }
}

모든 데이터는 getSession()을 사용해서 DAO에 할당돼 있는 Session을 가져온다.

 

 

 

DAO 구현하기

public interface ItemDAO extends GenericDAO<Item, String> {
  String getItem(String id);
}
public class HibernateDAO extends GenericHibernateDAO<Item, String> implements ItemDAO {
  public String getItem(String id){
    Query q = getSession().getNamedQuery("id");
    q.setParameter("id", id);
    
    return q.uniqueResult();
  }
}