<hibernate-mapping />
매핑설정의 루트요소 입니다. 모든 속성이 옵션이고 형태는 다음과 같습니다.
<hibernate-mapping
         schema="schemaName"                             
         catalog="catalogName"                               
         default-cascade="cascade_style"                 
         default-access="field|property|ClassName"  
         default-lazy="true|false"                             
         auto-import="true|false"                            
         package="package.name"                          
 />
schema(옵션) :  데이터베이스의 스키마 이름을 지정합니다.
catalog(옵션) : 데이터베이스의 카탈로그 이름을 지정합니다.
default-cascade(옵션 - 디폴트 none) : cascade 속성이 설정되지 않은 항목에 대해 기본값을 설정 합니다.
default-access(옵션 - 디폴트 proeprty) : access 속성이 설정되지 않은 항목에 대해 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다. ClassName 값은 잘 모르겠습니다.
default-lazy(옵션) : lazy 속성이 설정되지 않은 항목에 대해 적용 합니다.
auto-import(옵션 - 디폴트 true) : HQL 내에서 from절에 클래스를 명시할 때 auto-import 기능이 있기 때문
에 패키지경로 없이 클래스명만 적어줄 수 있습니다. 만약 다른 패키지에 동일한 클래스명을 가진 클래스가 있다면 예외가 발생합니다. 이 때는 auto-import 기능을 끄고(false) 패키지를 포함한 클래스명을 사용해야 합니다.
package(옵션) : 이 속성을 설정하면 하위요소에서 클래스를 명시할 때 패키지를 생략할 수 있습니다.

<class />

영속 클래스와 테이블을 매핑 할 때 사용합니다. 근데 속성이 너무 많습니다 @.@;;
그래서 자주 사용되는 몇가지 속성만 알아보겠습니다.
<class
       name="ClassName"                           
       table="tableName"                                      
       dynamic-update="true|false"                
       dynamic-insert="true|false"
       select-before-update="true|false"                
       where="arbitrary sql where condition"
       optimistic-lock="none|version|dirty|all"
       lazy="true|false"                          
/>
name(옵션) : 영속 클래스의 이름을 지정합니다. 루트 요소의 package 속성을 설정했다면 패키지 경로는 생략 가능합니다. 이 속성이 누락되면 non-POJO 엔티티로 인식 됩니다.
table(옵션) : 영속 클래스와 매핑되는 테이블 이름을 지정합니다. 이 속성이 누락된다면 패키지 경로가 무시된 클래스명이 기본값으로 설정 됩니다.
dynamic-update(옵션 - 디폴트 false) : true라면 값이 변경된 프로퍼티에 대해서 동적 SQL을 생성합니다.
dynamic-insert(옵션 - 디폴트 false) : true라면 값이 null이 아닌 프로퍼티에 대해서 동적 SQL을 생성합니다.
select-before-update(옵션 - 디폴트 false) : 객체의 변경이 확실하지 않은 경우 update를 실행하지 않습니다. 객체의 변경을 확인하기 위한 select가 실행되므로 퍼포먼스 감소가 있지만 detached 객체를 영속화 할때 update트리거를 피하기 위해 사용하면 좋습니다.
where(옵션) : 객체를 검색할 때 조건을 설정 합니다.
optimistic-lock(옵션 - 디폴트 version) : 객체 잠금 방식을 설정 합니다.
lazy(옵션 - 디폴트 true) : 전체적으로 늦은로딩을 사용할지의 여부를 설정합니다.

<id />
<id /> 요소를 이용해 클래스의 식별자와 데이터베이스 테이블의 주키를 매핑 합니다.
아래 속성말고 몇가지 더 있지만 자주 사용되는 몇가지 속성만 알아보겠습니다.
<id
    name="propertyName"                             
    type="typename"                                             
    column="column_name"
    access="field|property|ClassName">
    <generator class="generatorClass"/>
</id>
name(옵션) : 클래스의 식별자로 사용되는 프로퍼티 이름을 지정합니다.
type(옵션) : Hibernate 타입을 지정합니다.
column(옵션) : 테이블의 컬럼명을 지정합니다. 누락되면 프로퍼티 프로퍼티 이름으로 지정됩니다.
access(옵션) : 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다.

<generator />
<geerator /> 요소를 이용해 영속 클래스의 인스턴스들에 대한 유일한 식별자를 생성 하는 방식을 설정합니다.
<id name="id" column="ID">
    <generator class="sequence">
        <param name="sequence">ARTICLE_SEQ</param>
    </generator>
</id>
class : 식별자를 생성하는 클래스를 지정합니다.
<param /> 요소 : 각 생성기 마다 초기화를 위해 필요로하는 프로퍼티와 값을 지정할 수 있습니다.

IdentifierGenerator 인터페이스를 구현하여 생성기를 만들 수 있습니다.
Hiberante는 이미 구현된 생성기들을 제공하며 이것들은 단축된 이름으로 사용됩니다.
- increment : Hibernate가 직접 식별자를 생성합니다.
- indentity : MySQL, DB2, MS SQL, Sysbase, HypersonicSQL 의 식별 컬럼을 지원하며 리턴 타입은
long, short, int 입니다.
- sequence : 오라클, DB2, PostGreSQL 의 시퀀스를 사용하며 리턴 타입은 long, short, int 입니다.
- hilo : 지정한 테이블의 컬럼으로 hi값을 소스로 주어지면 hi/lo 알고리즘을 사용하여 long, short, int 타입의 식별자를 생성합니다.
- seqhilo : hilo와 동일하지만 시퀀스로부터 hi값을 가져옵니다.
- uuid : 128비트 UUID 알고리즘을 사용하여 String 타입의 식별자를 생성합니다.
- guid : MS SQL과 MySQL에서 데이터베이스 생성 GUID 문자열을 사용합니다.
- native : 데이터베이스가 제공하는 기능에 따라서 identity, sequence, hilo 중 한가지를 사용합니다.
- assigned : <generator /> 요소가 지정되지 않을 경우 사용되는 디폴트 값이며 직접 식별키를 입력 합니다.
- foreign : 연관된 클래스의 식별자를 사용합니다.

<property />
<property /> 요소는 일반 프로퍼티와 컬럼을 매핑 합니다.
<property
      name="propertyName"                                         
      column="column_name"                                        
      type="typename"                                             
      update="true|false"                                         
      insert="true|false"                                         
      formula="arbitrary SQL expression"                          
      access="field|property|ClassName"                           
      lazy="true|false"                                           
      unique="true|false"                                         
      not-null="true|false"                                                     
      generated="never|insert|always"                             
      length="L"
/>
name : 프로퍼티의 이름을 지정합니다.
column(옵션 - 디폴트 name으로 지정된 이름) : 매핑될 데이터베이스의 컬럼 이름을 지정합니다.
type(옵션) : Hibernate 의 타입을 지정합니다.
update, insert(옵션 - 디폴트 true) : update/insert 시 SQL에 포함될지 여부를 지정합니다.
formula(옵션) : 컬럼의 값을 계산하여 프로퍼티에 저장하는 SQL 표현식을 지정합니다.
access(옵션) : 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다.
lazy(옵션 - 디폴트 false) : 늦은로딩을 사용할지의 여부를 설정합니다.
unique(옵션 - 디폴트 false) : unique 인지 여부를 설정 합니다. true로 설정하면 property-ref 로 참조하는 것을 허용 합니다.
not-null(옵션 - 디폴트 false) :  null 가능 여부를 설정 합니다. true 면 not-null 입니다.
generated(옵션) : 매핑되는 컬럼이 데이터베이스에 의해 변경되는지 여부를 설정 합니다. 설정하게 되면 insert나 update이후 해당 컬럼의 값을 읽어와서 객체에 반영 합니다.
length(옵션) : 길이를 지정하는거 같은데 초과된 값을 넣어도 잘 들어가네요.. 이건 잘 모르겠습니다.

<many-to-one />
<many-to-one /> 요소는 n-1 관계를 매핑 합니다.
<many-to-one
        name="propertyName"                                         
        column="column_name"                                        
        class="ClassName"                                           
        cascade="cascade_style"                                     
        fetch="join|select"                                         
        update="true|false"                                         
        insert="true|false"                                         
        property-ref="propertyNameFromAssociatedClass"              
        access="field|property|ClassName"                           
        unique="true|false"                                         
        not-null="true|false"                                                                                                         
        entity-name="EntityName"                                    
        formula="arbitrary SQL expression"                          
/>
name : 참조키와 매핑되는 프로퍼티의 이름을 지정합니다.
column(옵션) : 참조키를 나타내는 컬럼을 지정합니다.
class(옵션 - 디폴트 프로퍼티의 타입) : 연관된 클래스를 지정합니다.
cascade(옵션 - 디폴트 none) : 연관된 클래스가 변경시 현재 클래스도 변경을 할것인지 설정 합니다.
fetch(옵션 - 디폴트 select) : join 할건지 select 할건지 설정 합니다.
update, insert(옵션 - 디폴트 true) : update/insert 시 SQL에 포함될지 여부를 지정합니다.
property-ref(옵션) : 이 참조키에 조인되는 연관 클래스의 프로퍼티 이름을 지정합니다. 연관된 클래스가 primary key가 없고 일반 컬럼을 유일한 값으로 사용하고 있을 경우에 사용 된다는군요.
access(옵션) : 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다.
unique(옵션 - 디폴트 false) : unique 인지 여부를 설정 합니다. true로 설정하면 property-ref 로 참조하는 것을 허용 합니다. 이것은 연관 다중성을 1-1로 만듭니다.
not-null(옵션 - 디폴트 false) :  null 가능 여부를 설정 합니다. true 면 not-null 입니다.
entity-name(옵션) : 연관된 클래스의 엔티티 이름을 지정합니다.
formula(옵션) : 컬럼의 값을 계산하여 프로퍼티에 저장하는 SQL 표현식을 지정합니다.

레퍼런스에 친절히 예제를 제공하네요.
가장 일반적인 형태 입니다.
product 프로퍼티는 Product 클래스와 연관되고 PRODUCT_ID 컬럼과 매핑되는 뜻이네요.
<many-to-one name="product" class="Product" column="PRODUCT_ID"/>

property-ref를 사용하는 예제 입니다. (권장되는 방법은 아니라는 군요.)
Product 클래스는 primary key 대신 일반 컬럼을 유니크하게 식별키로 사용하고 있습니다.

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>
OrderItem 클래스에서 property-ref 속성으로 연관된 테이블의 유일키를 설정 합니다.
<many-to-one name="product" property-ref="serialNumber"   
            column="PRODUCT_SERIAL_NUMBER"/>

<one-to-one />
<one-to-one /> 요소는 1-1 관계를 매핑 합니다.
<one-to-one
       name="propertyName"                                         
       class="ClassName"                                           
       cascade="cascade_style"                                     
       constrained="true|false"                                    
       fetch="join|select"                                         
       property-ref="propertyNameFromAssociatedClass"              
       access="field|property|ClassName"                           
       formula="any SQL expression"                                
       lazy="proxy|no-proxy|false"                                 
       entity-name="EntityName"
/>
name : 참조키와 매핑되는 프로퍼티의 이름을 지정합니다.
column(옵션) : 참조키를 나타내는 컬럼을 지정합니다.
class(옵션 - 디폴트 프로퍼티의 타입) : 연관된 클래스를 지정합니다.
cascade(옵션 - 디폴트 none) : 연관된 클래스가 변경시 현재 클래스도 변경을 할것인지 설정 합니다.
constrained(옵션) : 현재 테이블의 primary key가 연관된 테이블의 primary key를 참조하는지 여부를 지정 합니다. 주키이면서 참조키일 경우를 뜻하는거 같습니다.
fetch(옵션 - 디폴트 select) : join 할건지 select 할건지 설정 합니다.
property-ref(옵션) : 이 클래스의 primary key를 참조하는 연관 클래스의 프로퍼티 이름을 지정합니다.
access(옵션) : 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다.
formula(옵션) : 컬럼의 값을 계산하여 프로퍼티에 저장하는 SQL 표현식을 지정합니다.
lazy(옵션 - 디폴트 false) : 늦은로딩을 사용할지의 여부를 설정합니다.
entity-name(옵션) : 연관된 클래스의 엔티티 이름을 지정합니다.

이번에도 역시 레퍼런스에 예제가 있군요.
1-1 연관은 아래 두가지 형태로 나눠 집니다.
공유 primary key 연관
Employee 매핑
특별한게 없습니다.
<class name="Employee" table="EMPLOYEE">
    ...
    <one-to-one name="person" class="Person"/>
</class>
Person 매핑
부모와 동일한 식별값을 사용하기 위해 식별키 생성자로 foreign 를 사용해 연관된 프로퍼티를 파라미터로 지정했습니다. 그리고 바로 위 속성설명에 나와 있듯이 PERSON_ID 는 주키이면서 EMPLOYEE 테이블의 주키를 참조하는 참조키가 되므로 constrained 속성이 설정되었습니다.
<class name="person" table="PERSON">
    <id name="id" column="PERSON_ID">
        <generator class="foreign">
            <param name="property">employee</param>
        </generator>
    </id>
    ...
    <one-to-one name="employee"
        class="Employee"
        constrained="true"/>
</class>

foregin key 연관
이번에는 서로 다른 식별값을 사용하고 Employee에서 Person의 식별키를 참조하는 경우 입니다.
Employee 매핑
앗! n-1 요소로 바뀌었습니다. 하지만 unique 속성을 이용함으로써 다중 연관을 1-1로 만듭니다.
<many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/>
Person 매핑
양방향 참조를 가능하게 하기 위한 설정 입니다.
property-ref속성 값으로 Person 클래스의 주키를 참조하고 있는 Employee 클래스의 프로퍼티를 지정합니다.
<one-to-one name="employee" class="Employee" property-ref="person"/>

<join />
조인 테이블 사이의 1대1 관계가 존재할 경우 <join /> 요소를 이용해 매핑 합니다.
<join
        table="tablename"                       
        schema="owner"                          
        catalog="catalog"                       
        fetch="join|select"                     
        inverse="true|false"                   
        optional="true|false">                 
       
        <key ... />
       
        <property ... />
        ...
</join>
table : 조인 테이블의 이름을 지정합니다.
fech(옵션 - 디폴트는 join) : join 할건지 select 할건지 설정 합니다.
inverse(옵션 - 디폴트는 false) : true로 설정되면 변경에 대한 작업을 수행하지 않습니다.
optional(옵션 - 디폴트는 false) : true로 설정되면 프로퍼티들이 null이 아닐경우에 insert 합니다.

<composite-id />
복합키를 가진 테이블일 경우 <composite-id /> 요소와 하위 요소인 <key-property />와 <key-many-to-one /> 요소를 이용해 복합키를 설정할 수 있습니다.

자체적인 복합키를 사용하는 영속 클래스는 composite 식별자의 동등성을 구현하기 위해서 equals()hashCode()를 오버라이드 해야하며, Serializable 을 구현해야 합니다.
<composite-id
    name="propertyName"
    class="ClassName"
    mapped="true|false"
    access="field|property|ClassName">
   
    <key-property name="propertyName" type="typename" column="column_name"/>
    <key-many-to-one name="propertyName class="ClassName" column="column_name"/>
    ...
</composite-id>
name(옵션) : 외부 클래스로 복합키를 사용할 때 외부 클래스 타입의 프로퍼티 이름을 지정합니다.
class(옵션) : 복합키 클래스로 사용되는 외부 클래스를 지정합니다.
mapped(옵션) : 하나의 매핑된 composite 식별자가 사용됨을, 그리고 포함된 프로퍼티 매핑들이 엔티티 클래스와 composite 식별자 클래스 양자를 참조함을 나타냅니다. 이건 뭔지 잘 모르겠습니다.
access(옵션) : 프로퍼티에 접근하는 방법을 get/set을 이용할건지 직접 field에 접근 할건지 설정 합니다.

영속 클래스내에 복합키로 사용되는 프로퍼티를 외부 클래스로 정의할 수 있습니다. 이 경우 외부 클래스가
식별자로 사용되므로 외부클래스에 Serializable 을 구현해야 합니다. 간단한 예제를 보겠습니다.
외부 복합키 클래스

Member 클래스

매핑설정

테스트
허접한 테스트는 통과합니다.

'Hibernate' 카테고리의 다른 글

Entity type vs Value type  (1) 2008.02.05
Hibernate에서 HSQL 사용과 스키마 자동 생성  (0) 2008.02.05
Hibernate 기본 매핑 설정  (0) 2008.01.23
영속 클래스  (0) 2008.01.18
Hibernate 설정  (0) 2008.01.18
Hibernate 간단한 예제2  (2) 2008.01.17
Posted by 째코

댓글을 달아 주세요