레이블이 hibernate인 게시물을 표시합니다. 모든 게시물 표시
레이블이 hibernate인 게시물을 표시합니다. 모든 게시물 표시

2009년 1월 13일 화요일

테이블 죠인을 안한 상태에서 Projection을 세팅할때

Criteria를 사용할때 제목에 명시한 경우라면 아래 글이 조금이나마 도움이 될것입니다.

Criteria를 이용하여 projection을 설정하면 쿼리를 사용하는것보담은 보다 더 유연하게 원하는 필드의 데이타를 Fetch해올 수 가 있습니다.

하지만 보통은 여러테이블내의 데이타를 죠인하여 가져오는 경우에 대하여 테이블 죠인시 매 테이블 마다 개개의 별칭을 달아줍니다. 저 또한 이런 식으로 많이 코딩을 해왔었습니다.

하지만 DAO를 리펙터링 하는 도중 이상한 문제에 봉착했었습니다.
분명히 테이블 선언시 "a" 라는 별칭을 부여하였었는데 a.property 이런식으로 원하는 속성을 fetch하려니 존재하지 않는 속성이라는 에러가 자꾸 뜨지 뭡니까?

디버깅을 열심히 하는 도중 hibernate이 내부적으로 싱글테이블인 경우 자동으로 a라는 별칭을 무시하고 this라는 포인터를 통하여 POJO의 각 속성들을 접근할 수 있게끔 처리를 하고 있음을 알게 되었습니다.

이것땜에 삽질 반시간 정도는 했네요... ㅜㅜ

2008년 1월 8일 화요일

Projection 설정시 결과를 Entity로 리턴받기

Critera에서 받아온 데이타를 자동으로 POJO에 매핑시켜 봅니다.

NativeSQL이나 HQL이나 모두 데이타를 쿼리하여 가져올수 있지만 조건에 따라 복잡한 쿼리문은 Criteria 로 작성하는것이 더욱 직관적이고 이해가 쉽습니다.

하지만 단일 테이블이 아닌 연관 테이블일 경우 (*)를 이용하여 전체 필드의 값을 쿼리해 오는것은 오버헤드가 많이 걸립니다. 그래서 업무에서는 페이지에 필수로 표시시켜줄 몇가지 항목들만 쿼리문속에 Projection을 이용하여 쿼리를 하게 됩니다.

하지만 Criteria를 사용하여본 분들은 알수 있겠지만 단순히 Projection 만 세팅하게 되면 디비에서 Fetch한 데이타를 Object 배열을 통하여 리턴하게 됩니다. 사실 Projection 설정시 순서만 정확히 설정해주고 Object 배열속의 데이타를 그 순서에 따라 View에 표시시켜주면 그뿐이지만 좀 특수한 데이타 타입일 경우 (예하면 Date 타입)에는 원하는 타입으로 정확히 매핑을 시켜주지 않습니다.

하이버넷 매뉴얼을 읽어보는던중 우연히 위 문제를 해결할수 있는 절묘한 방법을 찾을수 있었습니다.

또한 Criteria의 ResultTransformer 가 PassThroughResultTransformer로 변환되므로 결과치는 우리가 원하는 결과하고 많이 차이가 날수 있습니다. 그래서 궁극적으로 c.setResultTransformer(new AliasToBeanResultTransformer()); 이 문구를 이용하여 리턴받을 List속의 인스턴스는 개개의 Entity라고 명시를 해주어야 합니다. (seResultTransformer를 이용하여 세팅을 해주지 않으면 Object[] 로 결과를 리턴하게 됩니다.)
실제 사용되는 예제코드를 첨부합니다.

  ProjectionList projList = Projections.projectionList();
  projList.add(Projections.property("i.sqEmlrcv"), "sqEmlrcv");
  projList.add(Projections.property("o.name"), "name");
  projList.add(Projections.property("i.emlRcpnt"), "emlRcpnt");
  projList.add(Projections.property("s.dtReg"), "dtReg");
  projList.add(Projections.property("i.stSendI"), "stSendI");
  projList.add(Projections.property("i.cdEmlerr"), "cdEmlerr");
  projList.add(Projections.property("i.onRcpt"), "onRcpt");
  projList.add(Projections.property("i.onReply"), "onReply");
  cri.setProjection(projList);

  cri.setResultTransformer(new AliasToBeanResultTransformer(SentMailV.class));

2007년 2월 14일 수요일

Hibernate 용 디버깅을 하기 위한 환경설정 - P6SPY설치하기

Hibernate은 일종의 투명한 ORM으로서 관계형 데이터 베이스 모델을 객체지향형 데이터 베이스 모델로 바꿔(?) 주는 매퍼이다.

하지만 Hibernate을 사용한 시스템 디버깅하기란 결코 쉽지는 않다.
Hibernate은 자동으로 HQL을 DBMS가 인식 가능한 SQL로 변환해주는 작용을 하는데 사용자한테 관심이 가는 부분은 SQL문이다. 이 역시 디버깅시 중요한 로깅정보로 쓸수있다.

1. 아래 사이트에가서 P6SPY 최신 버전을 다운로드 받는다.
http://sourceforge.net/projects/p6spy/
다운로드 받은 아카이브 압축을 해제하고 p6spy.jar 파일만 복사하여서 /WEB-INF/lib 속에 넣는다. 또한 spy.properties를 복사하여서 classpath가 잡힌 경로에로 붙혀넣기 해야 한다. 가장 보편적인 경우에는 src폴더속에 붙혀넣으면 된다. 왜냐면 src폴더속에 넣으면 ant로 빌드시 자동으로 WEB-INF속의 classes폴더속에 들어가지므로 다시 classpath를 설정해줄 필요가 없게 된다.

2. 기존에 spring에서 설정 했었던 DB 연결 관련 부분을 다시 설정 해준다.

<!-- DataSource Configuratin Bean -->
 <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName">
   <value>com.p6spy.engine.spy.P6SpyDriver</value>
  </property>
  <property name="url">
         <value>jdbc:mysql://localhost:3306/dbname</value>
  </property>
  <property name="username">
   <value>username</value>
  </property>
  <property name="password">
   <value>password</value>
  </property>
 </bean>

3. spy.properties파일을 에디터로 열고서 ORACLE JDBC DRIVER의 주석문 체크를 해제하고 MySQL JDBC DRIVER에는 주석문으로 막는다.
# oracle driver
realdriver=oracle.jdbc.driver.OracleDriver
# mysql Connector/J driver
# realdriver=com.mysql.jdbc.Driver

4. P6SPY의 LOG 포맷
현재 시간|실행시간|카테고리|stmt SQL 문자열|real SQL 문자열

5. P6SPY와 SQLPROFILER를 연동하여 실행중인 화면
사용자 삽입 이미지


P6SPY에서 얻은 로깅 정보를 분석해주는 툴인 SQLPRIFILER에 대해서는 차후 업뎃하겠다.

2007년 2월 13일 화요일

Struts Spring Hibernate 연동 문서

프로젝트를 진행해오면서 나름대로 정리한 Struts + Spring + Hibernate 연동에 관한 문서입니다.
자료는 PPT 포맷으로 작성이 되였습니다. 자료는 첨부파일로 첨부하였습니다.