태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


'Framework/ORM'에 해당되는 글 6건

  1. 2008/08/22 [Hibernate- ORM] 클래스 상속 매핑 (1) - (전체 상속구조 : 테이블) 1: 1
  2. 2008/08/06 [iBatis] sql문 작성할때 유용한 조건문들
  3. 2008/03/11 [Hibernate] Spring framework에서 hbm.xml 파일 한꺼번에 관리하기.
  4. 2008/02/27 [iBatis] 다양한 쿼리문 작성하기.
  5. 2008/02/05 [Hibernate] NonUniqueObjectException
  6. 2008/01/21 [iBatis] oscache 적용하기
2008/08/22 01:40

[Hibernate- ORM] 클래스 상속 매핑 (1) - (전체 상속구조 : 테이블) 1: 1

1. 전체 상속구조 하나당 테이블 하나
- 상속 구조를 하나의 테이블에 모두 담는 구조이다.
  이러한 구조는 각 구현되는 클래스를 구분하는 코드값이 존재하여야 한다.

Bill관련 클래스 다이어그램

Bill관련 클래스 다이어그램







<<table>>
MoneyTransaction
seq
transactedAccount
transactedAccount
classification
transactedCost
transactedContents
transactedDate
transLog
billedTerm
transactedType(구분)






 

<class name="MoneyTransaction" table="MoneyTransaction">
  <id name="seq" column="seq">
     <generator class="identity"/>
  </id>

   <discriminator column="transactedType" type="string"/>

...
   <!-- subclass안에 subclass가 가능하다. -->
   <subclass name="Bill" discriminator-value="bill">
       <property name="transLog" ..../>

       <subclass name="FixedBill" discriminator-value="fixedBill">
           <property name="billedTerm" column="billedTerm"/>
       </subclass>

       <subclass name="NormalBill" discriminator-value="normalBill">
       </subclass>
    </subclass>
</class>


흠... 대충 이해가 되나...discriminator라는 컬럼이 각각의 클래스들을 구분해주는 값이 되는것이다.

저 구분값때문에 저 상속구조가 하나의 테이블로 구현이 가능하다고도 할 수 있겠다.

java code : session.save(normalBill);

[ hibernate가 생성하는 sql ]
insert into MoneyTransaction(seq, ... ,transactedType ) values(?, ?, ..., 'normalBill');



장점.
1. 매핑이 간단하다.
2. 성능이 좋다 (Join이 없으므로.)

단점.
1. 클래스마다 사용하지 않는 테이블의 컬럼들이 존재하게 된다. 각 컬럼의 값은 null로 채워지게 되겠다.
2. 새로운 하위 클래스가 추가되었을때 테이블이 변경된다. (코드는 당연히 변경)

Trackback 0 Comment 0
2008/08/06 15:56

[iBatis] sql문 작성할때 유용한 조건문들

prepend – statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property – 체크되기 위한 프라퍼티(필수)


<isPropertyAvailable>
프라퍼티가 유효한지 체크(이를 테면 파라미터빈의 프라퍼티이다.)

<isNotPropertyAvailable>
프라퍼티가 유효하지 않은지 체크(이를 테면 파라미터의 프라퍼티가 아니다.)

<isNull>
프라퍼티가 null인지 체크

<isNotNull>
프라퍼티가 null이 아닌지 체크

<isEmpty>
Collection, 문자열 또는 String.valueOf() 프라퍼티가 null이거나 empty(“” or size() < 1)인지 체크

<isNotEmpty>
Collection, 문자열 또는 String.valueOf() 프라퍼티가 null이 아니거나 empty(“” or size() < 1)가 아닌지 체크.

<isNotEmpty prepend=”AND” property=”firstName” >
FIRST_NAME=#firstName#
</isNotEmpty>

Trackback 0 Comment 0
2008/03/11 20:46

[Hibernate] Spring framework에서 hbm.xml 파일 한꺼번에 관리하기.

Spring에선 Hibernate의 SessionFactory를 IoC로 관리하기 때문에...

xml에 정의를 해준다.

이 영향인지... hibernate의 hibernate.properties파일은 필요가 없어져 버렸다...

물론 hibernate.properties파일에 설정되야하는 내용은 Spring의 applicationXXX.xml파일에서 정의해야한다.

hbm.xml파일들도 물론 마찬가지인데...

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>Code.hbm.xml</value>
             <value>MajorCode.hbm.xml</value>
             <value>MinorCode.hbm.xml</value>
             <value>Account.hbm.xml</value>
              .....

            </list>
        </property>

        ......


위의 코드처럼 *.hbm.xml파일들을 관리하게 되는데... 이거 여간 짜증나는 일이 아니다...

*.hbm.xml파일들을 한곳에 모아서 한꺼번에 관리할 수 없을까? 라는 생각이 들 것이다...

물론 방법이 있다... 친절한 스프링씨...

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:/kr/trust/moneyplanner/domain/hbm</value>
            </list>
        </property>
        ....


Trackback 0 Comment 0
2008/02/27 11:15

[iBatis] 다양한 쿼리문 작성하기.

<펌글:http://blog.paran.com/devtopia/13828096>

실무에서 SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.

이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.

이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.

<statement id="dynamicGetAccountList" resultMap="account-result">
  select * from account
  <dynamic prepend="WHERE">
    <isNotNull prepend="AND" property="firstName">
      (acc_first_name = #firstName#
         <isNotNull prepend="OR" property="lastName">
             acc_last_name = #lastName#
         </isNotNull>
      )
    </isNotNull>

    <isNotNull prepend="AND" property="emailAddress">
      acc_email like #emailAddress#
    </isNotNull>

    <isGreaterThan prepend="AND" property="id" campareValue="0">
      acc_id = #id#
    </isGreaterThan>

  </dynamic>

  order by acc_last_name

</statement>


상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.

동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.


이러한 조건들에 대해 간단히 정리하면 아래와 같다.


바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.


바이너리 조건 속성

prepend

Statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

비교되는 property(필수)

compareProperty

비교되는 다른 property (필수 또는 compareValue)

compareValue

비교되는 값(필수 또는 compareProperty)


<isEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크

<isNotEqual>

프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크

<isGreaterThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크

<isGreaterEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크

<isLessThan>

프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크

<isLessEqual>

프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크


사용법 예제)

<isLessEqual prepend="AND" property="age" compareValue="18">

  ADOLESCENT = 'TRUE'

</isLessEqual>


단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.

prepend

statement에 붙을 오버라이딩 가능한 SQL부분(옵션)

property

체크하기 위한 프로퍼티(필수)

 

<isPropertyAvailable>

프로퍼티가 유효한지 체크

(이를 테면 파라미터의 프로퍼티이다.)

<isNotPropertyAvailable>

프로퍼티가 유효하지 않은지 체크

(이를 테면 파라미터의 프로퍼티가 아니다.)

<isNull>

프로퍼티가 null인지 체크

<isNotNull>

프로퍼티가 null이 아닌지 체크

<isEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크

<isNotEmpty>

Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크


사용법 예제)

<isNotEmpty prepend="AND" property="firstName">

  FIRST_NAME = #firstName#

</isNotEmpty>


다른 요소들

Parameter Present : 파라미터 객체가 존재하는지 체크

Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분

<isParameterPresent>

파라미터 객체가 존재(not null)하는지 체크

<isNotParameterPresent>

파라미터 객체가 존재하지(null) 않는지 체크

 

사용법 예제)

<isNotParameterPresent prepend="AND">

EMPLOYEE_TYPE = 'DEFAULT'

</isNotParameterPresent>


Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.

Iterate Attributes :

  prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)

  property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)

  open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)

  conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)

<iterate>

java.util.List 타입의 프로퍼티 반복


사용법 예제)

<iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR">

username = #userNameList[]#

</iterate>


주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.

Trackback 0 Comment 0
2008/02/05 01:18

[Hibernate] NonUniqueObjectException

NonUniqueObjectException

이미 Detached되어 있는 객체를 다시 load해서 사용하려고 할 때 나는 에러이다.

다시 Persistent State로 만들어주면 되겠지만....

난 그냥 객체들을 Singleton으로 만들어 버렸다... static Map을 만들어서... 쩝

Trackback 0 Comment 0
2008/01/21 18:47

[iBatis] oscache 적용하기

<cacheModel type="OSCACHE" id="getTopRankingCache">
            <flushInterval minutes="5" />
</cacheModel>


<select id="getTopRanking" resultClass="com.nhn.dejava.util.DataMap" 
                                            parameterClass="java.util.Map" cacheModel="getTopRankingCache">
  <![CDATA[
    select asldkfjaslkjf;laskjdf lj;l   <<- 쿼리 쓰는 부분....
   ]]>
</select>   


5분마다 캐쉬 리프레쉬..... 

머 iBatis에선 이렇게 캐쉬를 적용한다...
Trackback 0 Comment 0