JPA @ManyToOne
참조 : http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#ManyToOne
자 이번에는 Post쪽에서 생각해 보겠습니다. "하나의 Post는 하나의 Category와 연관을 맺고 있습니다." 그럼 1:1 인가요? ㅋㅋ 아니죠. "또 다른 하나의 Post가 위의 Post가 연관을 맺고 있는 Category와 연관을 맺을 수 있습니다." 따라서 다:1 즉 ManyToOne의 관계이 있습니다.
@ManyToOne에 설정할 수 있는 속성들은 위와 같습니다. 이 중에서 세 개는 이미 @OneToMany에서 살펴보았고, 새로운 것은 딱 하나 optional 이 있습니다.
optional 은 "부가적인", "임의의"란 뜻으로 해당 속성이 임의적으로 있을 수도 있고, 없을 수도 있는지를 설정하는 것 같습니다.
속성 |
설명 |
기본값 |
cascade |
관계를 맺고 있는 타겟 쪽에 어떠한 persistence operation들을 연쇄적으로 적용하고 싶을 때 설정합니다. ALL, MERGE, PERSIST, REFRESH, REMOVE 등의 값을 사용하여 여러 개의 cascade 속성을 설정할 수 있습니다. 참조무결성을 위한 설정으로 보이며, Hibernate의 @Cascade 를 사용하여 보다 다양한 cascade 옵션을 사용할 수 있습니다. |
비어있는 CascadeType 배열 |
fetch |
연관을 맺고 있는 Entity들을 요청하는 순간 가져오는 설정이 LAZY 며, 해당 Entity를 가져올 때 미리 연관을 맺고 있는 Entity들까지 모두 가져오는 것이 EAGER 입니다. |
FetchType.LAZY |
optinal |
해당 속성 또는 필드에 빈 값(null)이 들어갈 수 있는지 여부를 나타냅니다. 반드시 값이 필요하다면, true로 설정합니다. |
true |
targetEntity |
만약 Generic을 사용하지 않은 Collection일 때는 이 속성을 관계의 주인이 되는 쪽 클래스로 설정해 주어야 합니다. |
타입을 명시한 Collection을 사용했을 때는 해당 타입으로 사용합니다. |
다시 예제로 돌아가서 Post가 owning entity인데, 이 녀석을 삭제하거나, 변경한다고 해서, Category도 삭제되거나 변경되어야 하지는 않아도 될 것 같습니다. 흠.. 오히려 Category를 삭제하면 Post들이 모두 삭제 되어야 할 것 같은데 그러면 Cattegory에서 cascade 속성을 설정해야 하나;; 흠...
Post 객체를 불러올 때 Post와 연관을 맺고 있는 Category도 가져와야 할 필요는 없어 보입니다.
Post는 꼭 어느 Category엔가에는 들어야 할 것이기 때문에 외례키가 null일 경우는 없을 것 같습니다.
위 정황을 종합하여 다음과 같이 설정할 수 있겠습니다.
@ManyToOne(fetch=FetchType.LAZY, optional=false)
public Category getCategory() {
return category;
}
여기서 이만 끝나면 좋겠지만, 아직 끝나지 않았습니다. @JoinColumn 이라는 녀석을 붙여줘야 합니다. 다음 글에서 살펴보겠습니다.