본문 바로가기
dev/spring

Don't repeat the DAO!(Hibernate)

by igooo 2008. 11. 27.
728x90

하이버네이트를 사용하여 어플리케이션을 개발하다보면 CRUD구현을 반복적으로 구현하게됩니다.

DAO에 save, update, get, remove 등을 메소드들이 반복적으로 사용된다.
JAVA5가 나오고 GenericDAO에 대한 아이디어와 구현을 많이 찾아볼 수 있다.
아무튼 GenericDAO를 구현하여 반복적으로 사용되는 메소드를 줄여보자 ㅎ
GenericDao 인터페이스로 공통적으로 사용되는 메소드들을 등록시켜준다.

public interface GenericDao<T, PK extends Serializable> {

T get(PK id);

List<T> get(T t);

List<T> getAll();

void save(T t);

void update(T t);

void remove(PK id);

void remove(T t);

}



GenericDao를 구현하는 GenericDaoHibernate클래스를 구현한다.
스프링과 함께 사용하는 경우 HibernateTemplate를 사용하여 구현하거나 session을 직접 받아 사용해도 무관하다.

@Transactional

public class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T, PK> {

private HibernateTemplate hibernateTemplate;

private Class<? extends T> clazz;

protected GenericDaoHibernate(Class<? extends T> clazz) {

this.clazz = clazz;

}

public HibernateTemplate getHibernateTemplate() {

return hibernateTemplate;

}

@Autowired

public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {

this.hibernateTemplate = hibernateTemplate;

}

protected Class<? extends T> getClazz() {

return clazz;

}

protected void setClazz(Class<? extends T> clazz) {

this.clazz = clazz;

}

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public T get(PK id) {

return (T) getHibernateTemplate().get(clazz, id);

}

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public List<T> get(final T t) {

if (t == null) {

return getAll();

}

else {

HibernateCallback callback = new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException {

Example ex = Example.create(t).ignoreCase().enableLike(MatchMode.ANYWHERE);

return session.createCriteria(clazz).add(ex).list();

}

};

return (List<T>) getHibernateTemplate().execute(callback);

}

}

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public List<T> getAll() {

return getHibernateTemplate().loadAll(clazz);

}

@Transactional

public void remove(PK id) {

remove(get(id));

}

@Transactional

public void remove(T t) {

getHibernateTemplate().delete(t);

}

@Transactional

public void save(T t) {

getHibernateTemplate().save(t);

}

@Transactional

public void update(T t) {

getHibernateTemplate().update(t);

}

}



사용예제
예전에 게시판 댓글에 사용한 예제 소스입니다.

public class Board {

private Long id;

........

}


// BoardDao는 GenericDao를 상속받는다.

public interface BoardDao extends GenericDao<Board, Long> {


}


// BoardDaoHibernate는 다음과 같이 구현하면 GenericDao에 선언한 모든 메소드를 사용할 수 있다.

public class BoardDaoHibernate extends GenericDaoHibernate<Board, Long> implements BoardDao {


@Autowired

public BoardDaoHibernate(SessionFactory sessionFactory) {

super(Board.class);

}

}


필요한 부분만 BoardDao에 선언하여 사용할 수 있다.

CRUD연산만 줄어들어도 소스가 엄청 줄어든다.ㅎ

'dev > spring' 카테고리의 다른 글

Spring Framework - Runtime efficiency with String (today and tomorrow)  (0) 2024.06.02
Ehcache Annotations for Spring  (0) 2010.08.05
HiddenHttpMethodFilter  (0) 2010.06.24
Maven Build Script (spring + hibernate)  (0) 2009.12.07
제9회 kSUG 모임  (0) 2008.10.12