본문 바로가기

Programming!

JPA 코드성 데이터의 매핑

이런 방식을 처리하는 방법은 많다. 그중 하나만 참고.


우성 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 를 걸어서 처리하는 경우가 있는 데, 굳이 그럴 필요는 없을 것 같다.