본문 바로가기
Spring/jpa

jpa @ElementCollection 정리

by 무대포 개발자 2022. 1. 17.
728x90
반응형

source 는 Github 에 있습니다.

@ElementCollection 정리

  • JPA 는 ORM 이고 ORM 은 Object Releation Mapping 의 약자입니다.
  • RDB 의 경우 데이터를 저장할 때, collection 단위로 저장할 수 있는 방법이 없습니다.
    • 예를 들면, Member 라는 테이블에 phone_number 가 여러개 들어갈 수 없습니다.
  • JPA 에서는 @ElementCollection 을 이용해서 Collection 대상인 것을 알려줄 수 있습니다.

source 및 로그

Member Entity

  • 아래와 같이 Member Entity 에 roles collection 을 만들어주고 ElementCollection 을 선언해주면 Roles 테이블이 만들어집니다.

    @Entity
    public class Member {
    
    @Id
    @GeneratedValue
    @Column(name = "member_id")
    @Setter
    private Long id;
    
    @Column
    @ElementCollection
    private List<String> roles = new ArrayList<>();
    }

테이블 생성 Log


2022-01-04 17:51:41.800 DEBUG 2091 --- [  restartedMain] org.hibernate.SQL                        :

  create table member (
  member_id bigint not null,
  age integer,
  name varchar(255),
  tel_no varchar(255),
  primary key (member_id)
  )

2022-01-04 17:51:41.800 DEBUG 2091 --- [  restartedMain] org.hibernate.SQL                        :

    create table member_roles (
       member_member_id bigint not null,
        roles varchar(255)
    )

@ElementCollection vs 연관관계 (OneToMany, ManyToMany)

@ElementCollection

  • 부모 Entity 에 의해 관리됩니다.
    • 무슨 말인가 하면 위에 member_roles 에 member_id 와 관련된 키가 생성된 것을 볼 수 있습니다.
  • 부모와 함께 저장되고 삭제됩니다. casecade 옵션이 default 입니다.
  • 컬렉션 값 변경 시, 전체 삭제 후 새로 추가합니다.
    • member id 데이터 하나의 roles 가 변경되면 전체 삭제 후, 새로 추가합니다.

연관관계 (@OneToMany / @ManyToMany)

  • 여러 Entity 와 연관관계를 맺을 수 있으며, 연관관계를 맺을 때, 보통 ID 를 사용합니다.

결론

  • 위 특징을 잘알고 사용한다면 연관관계를 사용하지 않으므로 라인수가 줄어들며, 알아보기 쉬울 것입니다.

reference

댓글