하이버네이트/JPA - 자바의 ORM.

04. 테스트 환경을 위한 CRUD - DAO확장

앞으로 테스트를 계속 할 것인데 매번 DAO( Data Access Object) 를 계속 만들기가 힘이 듭니다.

앞으로의 테스트 환경을 위해 테스트를 위한 DAO를 만들고 하이버네이트 유틸 파일도 조금 손을 보겠습니다.

문제 : 매번 CRUD 를 위해서 비슷한 소스를 적어야하나요?! 밑에는 해답!

기존의 DaoMember를 DaoCommon 으로 확장함

제너릭을 사용하면 List, Set 같이 어떤 엔티티 클래스가 와도 이걸로 CRUD를 할 수 있었다!
(개발초보에게 뭔가 큰 즐거움이었음)

만들어진 소스는 다음과 같습니다. (장난감소스임)

package util;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;

public class DaoCommon<T> {
    
	
	private SessionFactory factory;
	private Class clazz;
	private String boardName;
	
	
	
	public DaoCommon(Class<?> clazz) {
		factory = HibernateTestUtil.getSessionFactory(clazz);
		this.clazz = clazz;
		this.boardName = clazz.getSimpleName();
	}
	
	
	
	public List<?> selectList() {
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		Query query = session.createQuery("from "+boardName);
		
		List<?> list = query.list();
		session.getTransaction().commit();
		return list;
	}

	public void delete(T member) {
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		session.delete(member);
		session.getTransaction().commit();
	}

	public void update(T selectedMember) {
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		session.update(selectedMember);
		session.getTransaction().commit();
	}

	public T selectById(int id) {
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		T member = (T) session.get(clazz, id);
		session.getTransaction().commit();
		return member;
	}

	public void insert(T member) {
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		session.save(member);
		session.getTransaction().commit();
	}

}

 

 

문제 : 기존의 하이버네이트유틸파일이 매번 같은 경로의 hibernate.cfg.xml 를 읽기 때문에 설정파일들이 나중에는 겹칠것같고 매번 db 테이블 새로 생성하기도 느릴 것같애요.

HibernateUtil 을 조금 손본 HibernateTestUtil !

하나의 패키지만 가동시키는 HibernateTestUtil 소스는 다음과 같습니다.

package util;

import org.hibernate.SessionFactory;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.boot.registry.StandardServiceRegistry;

/**
 * @author Deepak Kumar * Web: http://www.roseindia.net 
 *  Update by arahansa@naver.com
 */
public class HibernateTestUtil {
    private static SessionFactory sessionFactory;
	private static String configFile = "hibernate.cfg.xml";
	
	
	public static SessionFactory getSessionFactory(Class<?> clazz) {
		if(sessionFactory==null){
			try {
				configFile = "/" + clazz.getPackage().getName().replace('.', '/') + "/" + configFile;
				Configuration cfg = new Configuration().configure(configFile);
				StandardServiceRegistryBuilder sb = new StandardServiceRegistryBuilder();
				sb.applySettings(cfg.getProperties());
				StandardServiceRegistry standardServiceRegistry = sb.build();
				sessionFactory = cfg.buildSessionFactory(standardServiceRegistry);
			} catch (Throwable th) {
				System.err.println("Enitial SessionFactory creation failed" + th);
				throw new ExceptionInInitializerError(th);
			}
		}
		
		return sessionFactory;
	}

	public void shutdown() {
		sessionFactory.close();
	}
}

 

 

 

댓글

댓글 본문
  1. dbdyd
    감사합니다.
    도움이 많이 되고 있습니다.
  2. LEE SCOTT
    강의가 재미있습니다^^
    감사합니다.
  3. Scratchback
    잘 보고 있습니다. 감사합니다(4)
버전 관리
아라한사
현재 버전
선택 버전
graphittie 자세히 보기