콜백 메소드를 사용하지 않고 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을 사용하는게 편할 것 같습니다.