하이버네이트를 사용하여 어플리케이션을 개발하다보면 CRUD구현을 반복적으로 구현하게됩니다.
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);
}
@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 |