'Hibernate'에 해당되는 글 6건

  1. 2010.06.01 Hibernate CRUD 기본 API
  2. 2010.05.31 하이버네이트 매핑 타입
  3. 2010.05.31 equals(), hashcode() 메소드를 제공해보기
객체 저장 : 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 영겁회귀

댓글을 달아 주세요

<property name="title" COLUMN="TITLE" type="string" />
속성의 값은 string인데 자바 프로퍼티와 테이블 칼럼 사이의 매핑 타입이 'string'임을 명시한것.
하이버네이트는 이 매핑값을 사용하여 칼럼과 프로퍼티 값 사이의 변환을 알맞게 처리.

자바 기본 데이터 타입을 위한 매핑 타입

 매핑타입 자바 기본 데이타 타입
SQL타입

 int int
INTEGER

 long ong
BIGINT

 short short
SMALLINT

 float float
FLOAT

 double double
DOUBLE

 big_decimal java.math.BigDecimal
NUMERIC

 character java.lang.String CHAR(1)

 string java.lang.String
VARCHAR

 byte byte
TINYINT

 boolean boolean
BIT

 yes_no boolean
CHAR(1) true일경우 'Y', false일경우 'N'

 true_false boolean
CHAR(1) true일 경우'T', false일 경우 'F'

날짜와 시간을 위한 매핑 타입
 매핑타입 자바 타입
SQL 타입
 date java.util.Date / java.sql.Date
DATA
 time java.util.Date / java.sql.Time
TIME
 timestamp java.util.Date / java.sql.Timestamp
TIMESTAMP
 calendar java.util.Calendar
TIMESTAMP
 calendar_date java.util.Calendar
DATE

대용량 데이터를 위한 매핑 타입
 매핑타입 자바 타입
SQL 타입
 binary byte[] 
VARBINARY
 text java.lang.String
CLOB
clob java.sql.Clob
CLOB
blob
java.sql.Blob
BLOB
serializable
java.io.Serializable 인터페이스를 구현한 자바 클래스
VARBINARY
text, binary 매핑 타입을 사용하면 로딩하는 즉시 데이터를 읽어오게 된다.
용량이 큰 칼럼의 경우 java.sql.Clob, java.sql.Blob을 사용하여 필요할때만 로딩하도록 한다.
이들 LOB타입의 데이타를 위치를 가르치는 Locator이기 대문에 실제 값은 로딩되지 않는다.

Clob 타입이나 Blob타입은 실제 값에 접근할때에 값을 읽어오게 된다. But 트랜잭션 열려있는 동안에만 가능하다.
try {
  HibernateUtil.beginTransaction();
  ..
  // Transaction 범위 내에서만 LOB 타입 로딩 가능
  Blob fileContent = article.getAttachment().getFileContent();
  in = fileContent.getInputStream();
  ..
  HibernateUtil.commitTracnsaction();
}

LOB 타입의 프로퍼티에 값을 할때는 다음과 같이
Article article = new Article();
...
article.setContent( Hibernate.createClob(content));

다음 메소드가 제공됨
static Blob createBlob(byte[] bytes)
          Create a new Blob.
static Blob createBlob(InputStream stream)
          Create a new Blob.
static Blob createBlob(InputStream stream, int length)
          Create a new Blob.
static Clob createClob(Reader reader, int length)
          Create a new Clob.
static Clob createClob(String string)
          Create a new Clob.

Posted by 영겁회귀

댓글을 달아 주세요

영속 객체를 Set에 저장할때나, 준영속 객체를 영속 상태로 변경할때는 반드시
equqls(), hashCode()를 구현해주어야 한다.

equals()
- 테이블 식별자 값의 비교
/*
 * 객체가 테이블에 저장되기 전에는 식별자 필드값이 정해지지 않울수 있는데,
 * 이경우 식별자 필드의 값이 같다 하더라고 두 객체가 동일한 테이블 행을 표현한다고 말할수 없다.
*/
public boolean equals(Obejct other) {
   
    if (other == null) return false;
    if ( !(other instanceof User) ) return false;

    if (this == other) return true;
    User user = (User)others;

    if (other.getId() == null || this.getId() == null) return false;
    return this.getId().equals(user.getId());
}

- 비즈니스 키 비교
public class User {

    public boolean equals(Object other) {
        if (this == other) return true;
        if ( !(other intanceof User) ) return false;
        final User user = (User) other;
        // securityNo 와 name을 비지니스 키로 사용
        if ( !user.getSecurityNo().equals( getSecurityNo() )) return false;
        if ( !user.getName().equals( getName() )) return false;
        return true;
    }

    public int hashCode() {
        int result;
        result = getSecurityNo().hashCode();
        result = 29 * result + getName();
        return result;
    }
}


참조 : 객체의 hashcode에 대한 고찰

Posted by 영겁회귀

댓글을 달아 주세요