'API'에 해당되는 글 1건

  1. 2010.06.01 Hibernate CRUD 기본 API
객체 저장 : 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);



저작자 표시
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 영겁회귀

티스토리 툴바