'Hibernate'에 해당되는 글 1건

  1. 2013.06.11 하이버네이트 프로그래밍 - 4장 컬렉션과 연관(Association)

** 본 요약은 한빛미디어 '하이버네이트 프로그래밍' 책을 기준으로 작성되어져 있다.

** 본 설명은 바로 따라하기 하기엔 어려움이 있다. 책을 보지 않은 사람에게는 간단히 어떤 기능을 제공하는지 이해하는데 목적을 둔다.

** 하이버네이트 3.2.5.ga 버전, Ant 빌드를 기본적으로 사용한다.


4장 컬렉션과 연관

본 장에서는 객체간 관계나 그룹이 처리되는 방법은 알아본다.


테이블 간의 관계 표현하기


두개의 클래스 용 맵핑 문서를 만들고, 그 안에 'set'이라는 태그를 이용해 연결 정보를 추가하여 사용한다.


N:N 연결 관계는 다음 코드를 연결할 양쪽 클래스 맵핑 문서에 다음 내용을 추가해 구현한다.


<set name="[필드명]" table="[조인 테이블명]">

  <key column="[현재 테이블의 아이디 키]"/>

  <many-to-many class="[연결되는 대상 클래스]" column="[연결되는 테이블의 아이디 키]"/>

</set>


양쪽에 <many-to-many> 태그를 사용하면, 하이버네이트에서는 자동으로 현재 테이블의 아이디 키와 연결되는 테이블의 아이디 키가 컬럼을 가진 조인 테이블을 생성한다. 이 테이블과 실제로 맵핑되는 객체는 존재하지 않고 N:N 관계를 유지하기 위한 테이블인 조인 테이블로 사용하게 된다.


실제 전체 코드를 보면 다음과 같이 작성될 수 있다.


AAA 클래스용 매핑 문서

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.billy.sample.data.AAA" table="AAA">

<meta attribute="class-description">

A 샘플 클래스 매핑 예제

</meta>

<id name="id" type="int" column="AAA_ID">

<meta attribute="scope-set">protected</meta>

<generator class="native"/>

</id>

    

<property name="name_a" type="string" not-null="true"/>

    

    <set name="bset" table="AAA_BBB" inverse="true">

      <meta attribute="field-description">연관된 B 클래스</meta>

      <key column="AAA_ID"/>

      <many-to-many class="com.billy.sample.data.BBB" column="BBB_ID"/>

    </set>

  </class>

</hibernate-mapping>


BBB 클래스용 매핑 문서

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="com.billy.sample.data.BBB" table="BBB">

<meta attribute="class-description">

B 샘플 클래스 매핑 예제

</meta>

<id name="id" type="int" column="BBB_ID">

<meta attribute="scope-set">protected</meta>

<generator class="native"/>

</id>

    

<property name="name_b" type="string" not-null="true"/>

    

    <set name="aset" table="AAA_BBB">

      <meta attribute="field-description">연관된 A 클래스</meta>

      <key column="BBB_ID"/>

      <many-to-many class="com.billy.sample.data.AAA" column="AAA_ID"/>

    </set>

  </class>

</hibernate-mapping>


위 코드 중에 AAA 클래스용 매핑 문서의 <set> 태그 안에 inverse(역매핑)이 설정 되어 있다. 이는 AAA클래스의 bset이 변경이 일어나면 AAA_BBB 테이블이 변경되지 않지만, BBB클래스의 aset이 변경이 일어났을때 AAA_BBB 테이블이 자동 갱신되도록 설정한다.


이렇게 맵핑 문서를 작성하고 난 후 Hibernate tool을 이용해 소스코드를 생성하면 해당 객체에 다음과 같은 코드가 추가 된다.


public class AAA implements java.io.Serializable {

  ...

  private Set bset = new HashSet(0);

  

  public Set getBset() {

    return this.bset;

  }

  

  public void setBset(Set bset) {

    this.bset = bset;

  }

  ...

}


그런데 위의 코드는 Java 5 버전에서는 Typesefe 경고가 발생한다. 이를 처리하기 위해서는 자바 코드 생성시 다음과 같은 코드를 추가해준다.(Ant task기준)


<hbm2java jdk5="true">

위 코드를 추가 후에 자바코드를 추가 하면 


private Set<BBB> bset = new HashSet<BBB>(0); 

과 같이 타입이 명시된 제너릭 코드가 생성된다.


 

객체에서 관계된 테이블(컬렉션) 데이터 입력하고, 데이터 읽어오기


위 단계에서 N:N 설정된 데이터를 사용하는 방법은 간단한다. 자동생성된 클래스의 Set 부분에 해당 값을 추가 해서 저장하면 자동으로 조인테이블에 데이터가 생성된다. 데이터 읽어오는 방법도 기존의 앞에서 해당 객체를 불러오는 방법과 동일하게 사용하면 데이터를 가져올 수 있다.



1:N 관계 표현하기


N:N 관계 설정하는 방법과 비슷하지만 조금 더 간단한다. N:N에서 설정한 맵핑 파일에 주석을 단다고 가정하면 다음과 같이 맵핑 코드를 작성할 수 있다.


<set name="comments" table="AAA_COMMENTS">

  <key column="AAA_ID"/>

  <element column="COMMENT" type="string"/>

</set>


그러면 AAA_COMMENTS 테이블이 생성되고, 자바 코드상에도 Set<String> comments가 추가되어 사용할 수 있게 된다.



Posted by 빌리 :