Whiteship's Note


레퍼런스 12장에 오타

Spring/Chapter 12 : 2007.04.24 13:14


문제가 발생한 코드는 Spring Reference에 있던 소스 코드입니다.
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);
}
}
}
위 코드에 잘못된 부분이 getSession 메소드 뿐이 아니였습니다. 바로 아래에 있는 session.find()도 문제가 있습니다. find() 메소드는 Hibernate의 org.hibernate.classic 패키지의 Session 인터페이스에 있습니다. 그러나 보통 사용하는 Session은 org.hibernate 패키지의 Session 인터페이스이였습니다. 그리고 그곳에는 find()라는 메소드가 없지요.

classic 패키지에 있는 Session이 상위 패키지에 있는 Session 인터페이스를 상속하고 있습니다. 하지만.. 모든 인터페이스가 deprecated 됐습니다. -_-;;
사용자 삽입 이미지

굳이 deprecated된 인터페이스를 사용(org.hibernate.classic.Sessoin 사용)하는 예제코드의 의도를 살리려면 다음과 같이 코드가 바껴야 합니다.

import org.hibernate.classic.Session;

        Session session = (Session) getSession(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;
        }

org.hibernate.Session을 사용하려면 다음과 같이 코드를 바꿔야 합니다.

        Session session = getSession(false);
        try {
            List result = session.createQuery("from test.Product product where product.category=?").setString(0, category).list();
            if (result == null) {
                throw new MyException("invalid search result");
            }
            return result;
        }

구형 인터페이스를 사용하고 캐스팅을 사용하느냐(처음 것) 아니면 신형 인터페이스를 사용하여 캐스팅도 없애느냐(뒤에 있는 것). 의 문제 인데요. 당연히 후자가 되어야 적당하다고 생각합니다.

전자에서 사용한 인터페이스는 Hibernate2 부터 deprecated 된거라고 신형 Session을 사용하라고 API에도 나와있습니다.
An extension of the Session API, including all deprecated methods from Hibernate2. This interface is provided to allow easier migration of existing applications. New code should use org.hibernate.Session.
용겐 횔러 횽하 신형 API 사용해서 예제 수정 해주세욜~
top


Hibernate에서 쿼리 날리는 방법

Hibernate/study : 2007.01.19 16:47


참조 :
http://openframework.or.kr/JSPWiki/Wiki.jsp?page=Javacanhibernate7
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html

1. HQL 사용하기.

 Query

createQuery(String queryString)
          Create a new instance of
Query for the given HQL query string.

 

2. Criteria API 사용하기.

 Criteria

createCriteria(Class persistentClass)
          Create a new
Criteria instance, for the given entity class, or a superclass of an entity class.

 Criteria

createCriteria(Class persistentClass, String alias)
          Create a new
Criteria instance, for the given entity class, or a superclass of an entity class, with the given alias.

 Criteria

createCriteria(String entityName)
          Create a new
Criteria instance, for the given entity name.

 Criteria

createCriteria(String entityName, String alias)
          Create a new
Criteria instance, for the given entity name, with the given alias.

 

3. 그냥 SQL 문 날리기.

 SQLQuery

createSQLQuery(String queryString)
          Create a new instance of
SQLQuery for the given SQL query string.

 

'Hibernate > study' 카테고리의 다른 글

숙제 2  (0) 2007.01.26
HibernateTemplate  (0) 2007.01.26
HQL과 @Entity에 있는 name 속성의 관계  (0) 2007.01.24
Fluent Interface  (2) 2007.01.24
DbUnit  (2) 2007.01.23
Hibernate에서 쿼리 날리는 방법  (0) 2007.01.19
객체들의 상태 변화(in Hibernate)  (2) 2007.01.19
숙제  (0) 2007.01.19
Transaction  (2) 2007.01.02
JUnit 으로 Hibernate 테스트  (0) 2007.01.01
Detached Objects  (0) 2007.01.01
top