Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[JPA] @ElementCollection 본문

JPA

[JPA] @ElementCollection

JH_Lucid 2021. 11. 21. 16:32
사용
  • Entity가 아닌 단순한 형태의 객체 집합을 정의하고 관리하는 방법이다.
  • One to Many 관계를 다룬다.
  • @Embeddable 객체와 관계를 정의하여 사용할 수 있다.(아래 예시) 
  • @Entity를 대상으로는 사용 불가능하다.
  • 해당 데이터는 부모와 함께 저장되고 삭제된다.
  • 아래의 경우, OrderOption은 OrderOptionGroup과 항상 함께 관리된다는 의미이다.

 

 

< 예시 : OrderOptionGroup >

@Entity
@Table(name="ORDER_OPTION_GROUPS")
@Getter
public class OrderOptionGroup {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ORDER_OPTION_GROUP_ID")
    private Long id;

    @Column(name="NAME")
    private String name;
    
    @ElementCollection
    @CollectionTable(name="ORDER_OPTIONS", joinColumns = @JoinColumn(name="ORDER_OPTION_GROUP_ID"))
    private List<OrderOption> orderOptions;
    
    ...
  • 위의 OrderOption은 @Embeddable 객체로 정의되어 있다.
  • name : 데이터를 가지고 오거나 저장할 관계 테이블의 이름을 의미한다.
  • joinColumns : 데이터를 저장할 테이블의 어떤 field가 주 테이블과 join할지를 FK로 지정한다.
  • 추가로 @Column을 사용할 수 있다. List에 들어가는 객체가 String 등일 경우, 해당 value를 새로 생성되는 테이블에 넣고, Column으로 지정한 이름으로 관리한다. 위의 경우 객체는 OrderOption(embeddable)이므로, 객체 안의 value의 이름으로 테이블에 추가된다.
  • 정리하면, 
    @CollectionTable의 name은 생성될 테이블의 이름이 되고,  @JoinColumn의 field는 외래키 이름이 된다.
    @Column에 지정된 이름은 데이터가 저장되어 있는 field의 이름으로 지정된다. 따로 지정안하면 디폴드 값이 들어간다.

 

  • 위의 결과로 ORDER_OPTIONS라는 테이블이 생성된다.
  • 해당 테이블은 FK로 ORDER_OPTION_GROUP_ID라는 column을 가지고 부모테이블을 참조하는 FK로 사용할 것이며, OrderOption의 프로퍼티(name, price)를 column으로 가진다. 즉 fk를 반대쪽에서 관리하는 형태가 된다.

'JPA' 카테고리의 다른 글

QueryDSL로 한 방 쿼리 작성하기  (2) 2022.06.22
Comments