목차#

Tip 1 - 도메인 객체 안에서 xDoclet으로 뽑아낼 쿼리 작성하기
Tip 2 - Hibernate내의 쿼리문 관리하기.
Tip 3 - Hiberanate에서 동적테이블 매핑
Tip 4 - hibernate를 이용한 페이징 처리 게시판 만들때..

Tip 1 - 도메인 객체 안에서 xDoclet으로 뽑아낼 쿼리 작성하기#

@hibernate.query (0..*) Declare a named query for class

Applies to: Class level on bean

Parameter Type Applicability Description Mandatory name text Name of this query true query text Query contents true

여기서의 Class level on bean 의 의미를 이제서야 깨닫다니... -_ -a

/**
 * @hibernate.class table="NWBOARD"
 * @hibernate.query name="boardList" query="from Board board"

*/

이런 식으로 하는 것이었습니다. class level 이란게 저는 실제 도메인 클래스 level 이라고 생각해서 클래스 {} 닫힌 뒤에다 써보고 온갖 삽질을... ㅡ_ㅡ;;;

위와 같이 선언하고 ant 태스크에서 하이버네이트 xDoclet 으로 돌리니까 저번에 tumhuh(맞나? -_ㅜ) 님이 말씀해주신 것처럼,

 <query name="boardList"><![CDATA[
            from Board board
        ]]></query>

위와 같이 hbm 파일에 추가가 되네요.

Tip 2 - Hibernate내의 쿼리문 관리하기.#

public Query getNamedQuery(String queryName)
                    throws HibernateException
Obtain an instance of Query for a named query string defined in the mapping file. 

Parameters: 
queryName - the name of a query defined externally 
Returns: 
Query 
Throws: 
HibernateException

매핑파일에 아래처럼 선언하면 getNamedQuery(String queryName) 메소드로 Query를 사용할 수 있습니다..

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"

<hibernate-mapping> 

<class name="com.oreilly.hh.Track" table="TRACK"
... 
중략 
... 
</class

<query name="com.oreilly.hh.tracksNoLongerThan"
<![CDATA
from com.oreilly.hh.Track as track 
where track.playTime <= :length 
]]
</query> 

</hibernate-mapping>

Tip 3 - Hiberanate에서 동적테이블 매핑 #

<font color="red">카페 962, 965번 글입니다.</font>

상황

  1. Board.hmm.xml 이란 베이스 테이블이 있다,
  2. Board가 생성될때마다 각각 구조는 똑같고 이름만 틀린 테이블이 생성

Hibernate에서는

session 이 생성될때

  cfg.configure(/hibernate.cfg.xml);
  sessions = cfg.buildSessionFactory()

이런 부분이 있다.. 그러면 sessions에는 매핑된 테이블 정보가 모두 들어가 있습니다. 결과적으로 sessions 를 고쳐야 된다

Sessions를 고치는 소스

public static void renameTable(Class cls,String tableNamethrows HibernateException{
  Table table = cfg.getClassMapping(cls).getTable();
  
  if(!table.getName().equals(tableName)){
   table.setName(tableName);
   cfg.getClassMapping(cls).setTable(table);
   sessions = cfg.buildSessionFactory();
  }
 }

이렇게 sessions 를 재생성 해주면 됩니다. 결국 매핑 필드들은 가만히 있고 테이블명만 바꾸게 되는거죠...

테이블 동적 생성

SchemaUpdate 를 이용한다. 이것은 hibernate.cfg.xml 환경설정 파일의 옵션중에

<property name="hbm2ddl.auto">update</property>

이런 구절이 있습니다. 즉. hibernate.cfg.xml에서 매핑된 테이블 정보를 가져다가 자동생성 하겠는냐? 여기서 update는 테이블이 있을 경우에는 그냥 놔두고 없을경우에 테이블을 생성하라 이거죠..

그럼 실제로 이 일을 하는 클래스가 바로 SchemaUpdate란 클래스 입니다.

우선 소스를 보시면

 public static void renameTable(Class cls,String tableNamethrows HibernateException{
  Table table = cfg.getClassMapping(cls).getTable();
  
  if(!table.getName().equals(tableName)){
   table.setName(tableName);
   cfg.getClassMapping(cls).setTable(table);
   new SchemaUpdate(cfg).execute(true,true);
   sessions = cfg.buildSessionFactory();
  }

다 무시하고 전부 다시 생성하고 싶을때는 SchemaUpdate 대신에 SchemaExport(cfg).execute(true,true)를 사용하면 됩니다.

Tip 4 - hibernate를 이용한 페이징 처리 게시판 만들때..#

하이버네이트 Query 인터페이스의 setMaxResults(int maxResults) 메써드와 setFirstResult(int firstResult) 메써드를 이용하시면 됩니다. 이를테면, SQL 문에서 limit 0, 10 할때와 마찬가지로 setFirstResult(0), setMaxResults(10) 해주시면 되는거죠. 페이징 시에는 setFirstResult((page-1)*messagePerPage), setMaxResults(messagePerPage) 라고 해두시면 되구요. 여기서 page 변수는 현재 페이지번호, messagePerPage는 한페이지 당 보여줄 글 개수입니다

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 06-Apr-2006 09:45 by UnknownAuthor