Whiteship's Note

12.2.4. Implementing Spring-based DAOs without callbacks

Spring/Chapter 12 : 2007.04.24 11:36


콜백 메소드를 사용하지 않고 HibernateDaoSupport로 부터 Session을 구해서 다음과 같이 코딩할 수 있습니다.

public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {

    public Collection loadProductsByCategory(String category)
            throws DataAccessException, MyException {

        Session session = getSession(getSessionFactory(), false);
        try {
            List result = session.find(
                "from test.Product product where product.category=?",
                category, Hibernate.STRING);
            if (result == null) {
                throw new MyException("invalid search result");
            }
            return result;
        }
        catch (HibernateException ex) {
            throw convertHibernateAccessException(ex);
        }
    }
}

이 때 유용하게 사용할 수 있는 메소드로는 역시 Session을 가져다 주는 getSession메소드 입니다.

희한하네요. getSession() 메소드의 인자가 두 개인 녀석이 안보이는데 레퍼런스에 있는 예제 코드가 잘못된 것 같습니다. 이 것도 이슈트랙에 올려야 겠군요. "용겐 휄러 횽하 예제 코드가 또 틀렸어효"

getSession(); getSession(boolean allowCreate); => HibernateDaoSupport 클래스에 있고
getSession(SessionFactory sessionFactory, boolean allowCreate); => SessionFactoryUtils 클래스에 있습니다.

어쨋든 allowCreate 속성은 Session을 만들 때 가져올 때 현재 트랜잭션에서 가져오느냐 아니면 새 트랜잭션에서 가져오느냐를 설정해 줍니다. true면 새거 false면 현재 트랜잭션을 사용하게 됩니다.

convertHibernateAccessException(ex); 메소드는 이름에서도 알 수 있듯이 Hibernate에서 발생하는 예외를 바꿔줍니다. unchecked Exception으로 바꿔주는 일을 하겠죠.

즉 하드코딩을 하더라도 Spring이 제공하는 예외 랩핑을 사용할 수 있지만 try-catch 보기도 싫고 굳이 예외 변경하는 코드를 매번 넣어야 하기 때문에 대부분의 경우 HibernateTemplate을 사용하는게 편할 것 같습니다.


top

  1. Favicon of http://jjaeko.tistory.com BlogIcon 째코 2008.05.13 14:37 PERM. MOD/DEL REPLY

    allowCreate가 true면 새거 false면 현재 트랜잭션이라고 했는데
    현재 트랙잭션은 현재 세션으로 말을 바꾸어도 되나요??

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.05.13 18:13 신고 PERM MOD/DEL

    네 어쩌면 현재 쓰레드라고 하는게 가장 정확할 수도 있곘습니다. 현재 쓰레드의 ThreadLocal에 session이 있으면 그걸 가져오고 없으면 새로 만들기인데..

    보통 있어야 하는데 없는 경우 무슨 문제가 생긴 것이기 때문에 true로 해서 새로 만들고 문제를 덮을 수도 있겠지만, false로 해서 왜 현재 쓰레드에 묶인 세션이 없는건지 확인하는게 좋겠죠.

Write a comment.




: 1 : ··· : 4 : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : ··· : 14 :