forDevLife
[JPA] @ElementCollection 본문
사용
- 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