'하이버네이트'에 해당되는 글 2건

  1. 2010.06.01 Hibernate CRUD 기본 API
  2. 2010.05.27 영속 클래스 (persistence class)
객체 저장 : save(), persist()
try {
  HibernateUtil.beginTransaction();
  Session session = HibernateUtil.gertCurrentSession();
  session.save(article);
  ..
  HbernateUtil.commitTransaction();
  ..
}
persist()도 객체를 저장할수 있는 방법, 사용법도 동일
차이점은
 void persist(Object object)
          Make a transient instance persistent.
 void persist(String entityName, Object object)
          Make a transient instance persistent.

 Serializable save(Object object)
          Persist the given transient instance, first assigning a generated identifier.
 Serializable save(String entityName, Object object)
          Persist the given transient instance, first assigning a generated identifie
API와 같이 리턴 값의 차이. save()가 리턴하는것은  객체의 식별자 값으로 다음과 같이 사용가능
Integer i d= (Integer) session.save(article);

객체로딩
다음 메소드들을 이용
 Object get(Class clazz, Serializable id)
          Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.
 Object get(Class clazz, Serializable id, LockMode lockMode)
          Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.
 Object get(String entityName, Serializable id)
          Return the persistent instance of the given named entity with the given identifier, or null if there is no such persistent instance.
 Object get(String entityName, Serializable id, LockMode lockMode)
          Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance.

 Object load(Class theClass, Serializable id)
          Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
 Object load(Class theClass, Serializable id, LockMode lockMode)
          Return the persistent instance of the given entity class with the given identifier, obtaining the specified lock mode, assuming the instance exists.
 void load(Object object, Serializable id)
          Read the persistent state associated with the given identifier into the given transient instance.
 Object load(String entityName, Serializable id)
          Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
 Object load(String entityName, Serializable id, LockMode lockMode)
          Return the persistent instance of the given entity class with the given identifier, obtaining the specified lock mode, assuming the instance exists.
theClass파라마터는 로딩할 자바 클래스를 의미, id 는 식별자의 값을 의미

다음과 같은 매핑정보가 있다고 할때
<class name="pe.lucene.hibernate.Article" table="ARTICLE">
  <id name="id" column="ARTICLE_ID" type="int">
    <generator .... />
  </id>
 ..
</class>

Article article = (Article) session.get(Article.class, new Integer(10));
와 같이 테이블로부터 데이타를 읽어와 객체를 생성.
매핑되는 테이블에 데이타가 존재하지 않으면 Session.get()은 null을 리턴한다.

load() 메소드의 차이점은
get()메소드는 호출되는 시점에서 SELECT쿼리가 실행되는 반면에,
load() 메소드는 실제로 객체의 값이 필요할 때 SELECT 쿼리가 실행된다.
Article article = (Article) session.load(Article.class, new Integer(10)); //프록시객체를 리턴

int id = article.getId(); //이미 값을 가지고 있으므로 SELECT 실행없음
if (article.getTitle().startWith("[Re")) { //실제로 데이가ㅏ 필요한 시점이 되어 쿼리 실행됨
  ..
}
load()로 로딩한 객체가 테이블에 존재하지 않는 경우, SELECT 쿼리가 실행되는 시점에 테이블에 해당 데이타가 존재하지 않는다면,

org.hibernate
Class ObjectNotFoundException 를 발생시켜 객체가 존재하지 않음을 알려준다.

void load(Object object, Serializable id)
          Read the persistent state associated with the given identifier into the given transient instance.
 id에 해당하는 데이터를 테이블에서 읽어와 object에 저장해 줌.
Article article = new Article();
session.load(article, new Long(10));
식별자 값을 갖는 데이타가 없다면 동일한 예외를 발생시킨다.

객체수정 : update()
HibernateUtil.beginTransaction();
Article article = (Article)HibernateUtil.getCurrentSession().get(Article.class, new Integer(10));
article.setTitle(updatedTitle);
..
HibernateUtil.commitTransaction();
트랜잭션내에서 Session.get(), Session.load() 메소드로 로딩한 객체의 값을 수정해 주기만 하면 된다.
트랜젝션이 종료될때 UPDATE 쿼리가 실행된다.

Session.update()를 호출하는 방법도 있음
Article article = new Article();
article.setId(new Integer(10));
article.setTitle(updatedTitle);
..
try {
  HiberanteUtil.beginTransaction();
  HibernateUtil.getCurrentSession().update(article);
  HibernateUtil.commitTransaction();
} finally {
  ..
}
변경하고자 하는 객체를 생성후, Session.upate() 메소드에 전달하게되면,
UPDATE 쿼리가 실행되어서 데이타베이스에 변경된 값이 반영된다.
데이타가 존재하지 않으면

org.hibernate
Class StaleStateException 를 발생.

Session.update()를 사용할때는 반드시 객체의 모든 값이 설정되어 있어야 한다. 
프로퍼티를 설정하지 않게 되면, UPDATE 쿼리에 전달되는 값이 null 로 설정된다.

객체삭제 - delete()
HibernateUtil.beginTransaction();
Article article = new Article();
article.setId(10L);
HibernateUtil.getCurrentSession().delete(article);
HibernateUtil.commitTransaction();
삭제할 데이타가 존재하지 않는다면,StaleStateException 이 발생함.
Session.delete()로도 삭제가 가능
Article article = (Article)session.laod(Article.class, new Integer(10));
session.delete(article);



저작자 표시
신고
Posted by 영겁회귀
자바 클래스를 하이버네이트에서 사용하기 위해 필요한 조건

1. 기본 생성자를 제공
2. 데이터베이스 식별자 칼럼과 매핑될 필드를 제공
id등 식별자값을 많이 사용하므로, 식별자 칼럼용 필드를 제공하는 것이 좋다.
detached(준영속)상태의 객체를 update나 merage를 사용하여 영속상태로 변경할때나
Session.saveOrUpdate()
3. 영속 클래스를 final 로 지정하지 않는다
4. 클래스 필드를 위한 get/set메소드를 제공
5. equals()와 hashCode()  메소드를 제공
6. Serializable 인터페이스를 구현

붉은색 조건은 필수 조건, 파란색 조건은 따르는 것이 좋은것
, 녹색 조건은 필요한 경우만

p.s 영속클래스란?
      영속클래스는 비지니스 문제의 엔티티들을 구현하는 어플리케이션 내의 클래스들을 말함
       http://jjaeko.tistory.com/37
       http://openframework.or.kr/framework_reference/hibernate/ver3.x/html/persistent-classes.html
저작자 표시
신고
Posted by 영겁회귀

티스토리 툴바