이런 방식을 처리하는 방법은 많다. 그중 하나만 참고.
우성 Forum / ForumCategory Entity가 있다고 치자.
forum |
|
id |
PK |
forumCategoryId |
|
forum_category |
|
id |
PK |
name |
|
조건으로 하나의 forum이 하나의 category만 가질 수 있는 형태로 보자.
이경우 OneToOne이 바로 나오기는 하는데, 어쩐지 MapsId 나 OneToOne 자체에 대해 고민도 하고 그렇게 된다..
근데 어짜피 카테고리의 관리 주체도 일반적인 사용자가 아니고 관리자이며, forum의 저장시 forum_category의 데이터 저장은 불필요하기 때문에(forum 테이블의 forumCategoryId 만 저장되면 된다.) 그런 고민이 과연 필요할까 싶다.??
그냥 이 경우는 양방향의 연계도 아니고 단반향(?)이라고 부르기도 애매한.. 조회만을 위한 관계형성이 된 상태이기 때문에 @MapsId 같은 관계는 맺어줄 필요조차 없다.
(@MapsId 사용시 정말 원하지 않는 id의 조회가 이루어 질 수 있다. OneToOne 의 관계시 정말 필요한 관계인지 다시 한번 생각해 보자.)
아래와 같이 OneToOne만 맺어주고 cascadeType을 DETACH로 하자.
public class Forum...{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id
private Long id;
@OneToOne(cascade = CascadeType.DETACH)
@Where(clause = "deleted='N'")
@JoinColumn(name = "forumCategoryId", referencedColumnName = "id")
private ForumCategory forumCategory;
}
이 경우 view에서는 어떻게 지정하고 어떻게 받아야 할까?
<select id="forumCategory" name="forumCategory.id">
<option....
</select>
...or
<input ...
위에 처럼만 name을 지정해주면 이상없이 저장된다.
참고로, 간혹 이런 경우 view 의 입력을 forumCategoryId라는 별도의 속성을 주고 Forum entity에서 forumCategoryId 를 추가 후, @Transient 를 걸어서 처리하는 경우가 있는 데, 굳이 그럴 필요는 없을 것 같다.