Whiteship's Note

ManyToMany 관계 맵핑

Hibernate/Chapter 7 : 2008. 2. 9. 10:20


단방향 다대다 관계

  • 대부분 추가적인 정보가 필요하기 때문에, 별도의 assiation class를 만들게 된다. 여기서는 간단한 다대다 맵핑.

Set 타입으로 맵핑하기

Category.java
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM", joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
private Set<Item> items = new HashSet<Item>();
  • 이 때는 Category 클래스에 별도의 컬럼이 생기지 않는다. @ManyToOne에서 Join Table을 만들었을 때는 inverseJoinColumns의 컬럼이 생겼었다.
  • 콜렉션에 추가할 때(category.getItems().add(itme)) 다음의 SQL 날린다. insert into CATEGORY_ITEM (CATEGORY_ID, ITEM_ID) values (?, ?)

Idbag 타입으로 맵핑하기

Category.java
@ManyToMany
@CollectionId(
columns=@Column(name="CATEGORY_ITEM_ID"),
generator = "sequence",
type = @Type(type="long")
)
@JoinTable(name = "CATEGORY_ITEM", joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
private Set<Item> items = new HashSet<Item>();
  • surrogate 키를 가지고 있기 때문데, 중복을 허용한다.
  • @CollectionId, @Type은 하이버네이트의 애노테이션이다.
  • 콜렉션에 추가할 때 다음의 SQL 날린다. insert into CATEGORY_ITEM (CATEGORY_ID, CATEGORY_ITEM_ID, ITEM_ID) values (?, ?, ?)

List 타입으로 맵핑하기

Category.java
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM", joinColumns = @JoinColumn(name = "CATEGORY_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
@IndexColumn(name = "DISPLAY_POSITION")
private List<Item> items = new ArrayList<Item>();
  • 콜렉션에 추가할 때 다음의 SQL 날린다. insert into CATEGORY_ITEM (CATEGORY_ID, DISPLAY_POSITION, ITEM_ID) values (?, ?, ?)

양방향 다대다 관계

Item.java
@ManyToMany(mappedBy="items")
private Set<Category> categories = new HashSet<Category>();
  • 양방향 관계에서 1쪽의 inverse로 맵핑했었던 이유? 외례키 컬럼을 두 번이나 사용했으니까.
  • 이번에도 마찬가지로, 두 쪽 중에 한 쪽은 inverse로 설정해 주어야 한다.
  • cascade 설정 중에 all, delete, delete-orphans는 다대다 관계에서 의미가 없다. 왜? Value 타입이면 모를까, Entity 타입인데, 다른 Entity가 지워진다고 해서, 해당 Entity까지 지워지라는 보장은 없다. 거의 그런 경우는 없을 것이다. 따라서 의미가 없다. save or update만 사용하는게 좋겠다.
  • 양방향 관계에 있는 콜렉션 타입 결정은 inverse와 관련이 있다. inverse쪽에는 bag과 set처럼 id가 없는 것들만 올 수 있다. 왜? index나 키를 생성하는 쪽 SQL을 무시해버리면 indexColumn에 필요한 정보가 들어갈리 없으니까. 결론적으로, 양쪽 모두 index나 키를 가지는 콜렉션끼리 다대다 관계를 가질 수 없다. 왜? 양쪽 중 한 쪽은 inverse로 설정할 텐데 그러면 그 쪽에 필요한 정보가 생성되지 않을테니까.

'Hibernate > Chapter 7' 카테고리의 다른 글

다형적인 콜렉션 연관  (0) 2008.02.20
다형적인 ManyToOne 연관  (0) 2008.02.20
하이버네이트 애노테이션과 XML 설정 사이의 Fetching 기본값 차이  (0) 2008.02.20
맵 맵핑하기  (0) 2008.02.09
Join Table에 컬럼 추가하기  (0) 2008.02.09
ManyToMany 관계 맵핑  (7) 2008.02.09
OneToMany 관계 맵핑  (1) 2008.02.09
Multy-valued entity 연관  (0) 2008.02.09
OneToOne Join Table 맵핑  (0) 2008.02.09
OneToOne 외례키 맵핑  (0) 2008.02.09
주키를 공유하는 맵핑  (0) 2008.02.09
top

  1. seeyoung 2008.03.18 22:08 PERM. MOD/DEL REPLY

    ManyToMany로 세개의 테이블이 연결될때 두개까지는 문제가 없는데, 세개부터는 Table생성이 되지 않고 있습니다. 어떤 문제 일까요?

    @ManyToMany()
    @JoinTable(
    name="ROLE_AUTHORITY",
    joinColumns=@JoinColumn(name="ROLE_ID",
    inverseJoinColumns=@JoinColumn(name="AUTHORITY_ID"
    )
    private Set<Authority> authorities = new HashSet<Authority>();

    @ManyToMany()
    @JoinTable(name = "GROUP_ROLE",
    joinColumns = @JoinColumn(name = "GROUP_ID",
    inverseJoinColumns = @JoinColumn(name = "ROLE_ID";)
    private Set<Role> roles = new HashSet<Role>();

    Authority, Role, ROLE_AUTHORITY, GROUP_ROLE까지는 테이블 생성을 확인했는데, Group 테이블은 생성이 되어 있지 않고, Group 객체를 만들어서 save하려고 하자 에러가 발생합니다.

    ManyToMany에 대해 세개까지 연결되는게 문제가 있는지요?

    seeyoungAtgmail.com으로 알려주시면 대단히 감사하겠습니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.03.18 22:33 신고 PERM MOD/DEL

    Group ---> Role ---> Authority
    세 개의 Entity들이 이렇게 연관되어 있나보군요.
    재미있겠네요. 해보고 블로그에 올리겠습니다.

    저런 상황에서 JoinTable을 사용하여 맵핑하고, Group을 저장하면 되는거군요.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.18 23:11 PERM MOD/DEL

    아항.. Group이라는 이름이 사용하시는 DB에 키워드로 잡혀있어서 테이블을 못 만든것 같습니다.

    Group위에 붙인 @Entity에 name 속성에 다른 이름을 주고 해보시면 잘 될 겁니다. :)

  2. seeyoung 2008.03.19 11:23 PERM. MOD/DEL REPLY

    Thanks SO MUCH!!!

    맞습니다. DB Keyword인듯 합니다. Class명을 아여 UserGroup으로 변경했는데, 잘 되는군요.

    정말 감사합니다.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.19 12:28 PERM MOD/DEL

    :)

  3. seeyoung 2008.03.19 11:36 PERM. MOD/DEL REPLY

    아하... group by에 group 키워드에 걸린거 같군요.

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.03.19 12:27 PERM MOD/DEL

    오호~ 그렇군요.ㅋㅋ

Write a comment.




: 1 : ··· : 5 : 6 : 7 : 8 : 9 : 10 : 11 : 12 : 13 : ··· : 15 :