'매핑'에 해당되는 글 2건

  1. 2008.02.18 m-n 연관 매핑, inverse 속성 (2)
  2. 2008.02.13 1-1 연관 매핑
참고 : 래퍼런스 6장

카테고리는 여러개의 아이템을 가질 수 있고 아이템은 여러개의 카테고리에 포함될 수 있습니다.
사용자 삽입 이미지









단방향 매핑

<bag /> 요소의 table 속성 값으로 다대다 관계를 해소하기 위한 조인 테이블을 지정 했습니다.
그리고 <many-to-many /> 요소를 이용해 연관된 테이블의 컬럼과 클래스를 매핑 합니다.
cascade에 delete 옵션이 없는 이유는 어떤 카테고리가 삭제될 때 연관된 아이템까지 삭제되므로 삭제 되는 아이템들을 포함하는 카테고리에 영향을 미치기 때문입니다.

양방향 매핑
Item쪽도 마찬가지로 <many-to-many /> 요소를 이용해 연관된 테이블의 컬럼과 클래스를 매핑 합니다.
다른 점은 컬렉션 요소(<bag />) 의 inverse 속성을 true로 설정한 것입니다. 양방향 매핑이므로 자바 객체상에서 양방향 링크가 되어 있어야 한다는건 이전에도 밝힌바 있습니다.

그렇다면 inverse 속성 무엇일까요?
이전 글(1-n 연관 매핑)의 중간 부분에 inverse 속성에 대해 정리한게 있습니다. inverse 속성은 1-n 관계뿐 아니라 m-n 관계에서도 같은 의미를 가집니다. 만약 위(양방향 매핑) 상황에서 inverse 속성을 제거하면 어떤 일이 벌어질까요? 아래 코드를 실행하면...
Category c = new Category("카테고리1");
c.addItem(new Item("아이템1"));
c.addItem(new Item("아이템2"));
c.addItem(new Item("아이템3"));
      
session.save(c);
addItem 메서드는 양방향 링크를 위한 관리메서드 입니다.
public void addItem(Item item) {
    item.getCategories().add(this);
    items.add(item);
}
이런 작업이 수행 됩니다.
......
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
insert into CATEGORY_ITEM (ITEM_ID, CATEGORY_ID) values (?, ?)
insert into CATEGORY_ITEM (ITEM_ID, CATEGORY_ID) values (?, ?)
insert into CATEGORY_ITEM (ITEM_ID, CATEGORY_ID) values (?, ?)
3개의 insert는 Category에 대한 변경을 알아채고 수행한 것이고
나머지 3개의 insert는 Item에 대한 변경을 알아채고 수행한 것입니다. 이렇게 불필요한 나머지 3개의 수행을 방지하기 위해 주최측의 반대쪽에 inverse 속성을 설정하는 것입니다. 다시 한번 정리하자면 inverse 속성은 연관의 한 측을 끝으로 만들어 변경을 무시하도록 하는 속성 입니다.

한가지 의문점...
문득 이런 생각이 들었습니다.
"만약 자바 객체상에서 양방향 링크가 이루어지지 않는다면 inverse 속성도 필요 없지 않을까?"
그래서 자바 객체상에서 양방향 링크를 제거하고 inverse 속성도 제거 해봤습니다.
위에 나와 있는 양방향 링크와 동일한 테스트 입니다.
Category c = new Category("카테고리1");
c.addItem(new Item("아이템1"));
c.addItem(new Item("아이템2"));
c.addItem(new Item("아이템3"));
      
session.save(c);
addItem 메서드에서 더 이상 양방향 링크를 하지 않습니다.
public void addItem(Item item) {
    items.add(item);
}
실행 결과 입니다.
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)
결과는 이상이 없습니다. 1-n 연관에서는 양방향 링크가 없으면 부모를 참조하는 컬럼이 null로 되었지만 m-n 연관에서는 이상이 없었습니다. insert 이외에 카테고리를 가져온후 양방향 링크 상태가 되어있는지 테스트도 이상이 없고 delete 테스트도 이상이 없었습니다.
그래서 저는 이렇게 생각 합니다.
어플리케이션이 객체 저장 시점에서 양방향 링크가 되지 않아도 상관 없다면 inverse 속성이 없는게 이득이라고 생각 됩니다. 왜냐면 inverse 속성이 존재한다면 owner side 측과 other side(inverse) 측이 구분되어 owner side로만 작업을 해야 하는데 inverse 속성이 없다면 owner side, other side 구분이 없어지기 때문에 어느쪽이든 작업이 가능하기 때문 입니다. 또한 inverse가 없다고 해서 객체를 가져온 시점에 양방향 링크가 안되어 있진 않으니까 문제가 없다고 생각 됩니다.
신고

'Hibernate' 카테고리의 다른 글

객체의 상태  (0) 2008.03.02
상속 매핑  (0) 2008.02.23
m-n 연관 매핑, inverse 속성  (2) 2008.02.18
1-n 연관 매핑(컬렉션 매핑), inverse 속성  (0) 2008.02.17
n-1 연관 매핑  (0) 2008.02.17
1-1 연관 매핑  (0) 2008.02.13
Posted by 째코

1-1 연관 매핑

Hibernate 2008.02.13 00:35
참고 : 래퍼런스 7장

리스트로 보여줄 필드가 존재하는 Article 클래스와 해당 Article을 선택 했을 때 보여줄 ArticleDetail 클래스를 나눠서 3가지 방법으로 1-1 연관을 맺어 보겠습니다.

참조키를 이용한 매핑
아래 설정은 참조키를 이용한 단방향으로써 부모(Article)측에만 연관 설정이 되어 있습니다.
참조키를 이용한 1-1 연관일 경우 부모측에 <many-to-one /> 요소를 이용 하게 되는데 여기서 주의 사항이 있습니다. 참조키를 이용한 1-1 매핑의 경우 <many-to-one /> 요소를 이용하며 unique 속성을 true로 설정해야 한다는 것 입니다. 래퍼런스에는 unique 속성이 참조키 설정을 위한 것이며 연관 다중성을 1대1로 만들어 준다고 나와 있습니다. 즉 한개의 Article 객체는 한개의 ArticleDetail 객체와 연관 된다는 뜻 입니다.

위 설정은 단방향이며 양방향 매핑의 경우 ArticleDetail 매핑을 아래와 같이 변경 합니다.
아래 설정을 보면 <one-to-one /> 요소가 추가된 것을 볼 수 있습니다. 그런데 proeprty-ref 속성이 등장 했군요. 래퍼런스에는 이 클래스의 주키에 연결된 연관 클래스의 프로퍼티 이름을 지정한다고 나와 있습니다. 즉 이 클래스(ArticleDetail) 의 주키(id)에 연결된 연관 클래스(Ariticle)의 프로퍼티(detail)를 지정한다는 뜻 입니다.

하나의 주키를 이용한 매핑
아래 설정은 하나의 주키를 공유하는 단방향으로써 ArticleDetail 측에만 연관 설정이 되어 있습니다.
세가지 포인트가 있습니다.
1. 주키를 부모의 키와 공용하기 위해 foreign을 사용
2. <one-to-one /> 요소의 constrained 속성을 true로 설정
3. 연관의 방향이 반대로 역전
ArticleDetail 의 주키는 연관된 클래스에 대한 참조키 이므로 constrained 속성을 true로 설정 했습니다.
그리고 연관의 방향이 반대로 역전되어 있는데 이 경우 작업을 ArticleDetail 객체로 해야 하기 때문에 현재 상황에서는 단방향 매핑이 의미가 없습니다.

양방향 매핑을 위해 Artciel 매핑을 아래와 같이 변경 합니다.
양방향 매핑의 경우 자바코드내의 양방향 링크가 필수 입니다.

조인 테이블을 이용한 매핑
아래 설정은 조인테이블을 이용한 단방향으로써 부모(Article)측에만 연관 설정이 되어 있습니다.
<join /> 요소와 <key /> 요소를 이용한것을 빼고는 참조키를 이용한 매핑의 경우와 동일 합니다.
optional 속성을 true로 설명하면 조인 테이블의 프로퍼티들이 null이 아닐 경우 insert를 하게 됩니다.

위 설정은 단방향이며 양방향 매핑의 경우 ArticleDetail 매핑을 아래와 같이 변경 합니다.
양방향 매핑의 경우 한 쪽 끝임을 알리기위해  inverse 를 true로 설정해야 합니다.
신고

'Hibernate' 카테고리의 다른 글

1-n 연관 매핑(컬렉션 매핑), inverse 속성  (0) 2008.02.17
n-1 연관 매핑  (0) 2008.02.17
1-1 연관 매핑  (0) 2008.02.13
Value 타입 매핑  (0) 2008.02.06
Entity type vs Value type  (1) 2008.02.05
Hibernate에서 HSQL 사용과 스키마 자동 생성  (0) 2008.02.05
Posted by 째코