(JPA) @ElementCollection, @Embeddable, @Embedded

yookyungmin·2023년 4월 12일
0

@ElementCollection

  • RDB 의 경우 데이터를 저장할 때 값 타입을 하나 이상 저장하려 할 때 사용하는 어노테이션
  • 부모 Entity가 삭제될 경우 삭제 된다
  • JPA에서는 @ElementCollection 을 이용해서 Collection 대상인 것을 알려줄 수 있습니다.
  • @OneToMany 와 혼동이 있을수 있는데 @Entity 객체일 경우엔 @ElementCollection을 사용할 수 없다
    @Entity
    @Getter
    @NoArgsConstructor(access = PROTECTED)
    public class StudyConfirmation {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        @ManyToOne
        private Study study;
        @ManyToOne
        private User user;
        private String title;
        private String content;
        @ElementCollection
        private List<StudyConfirmationFile> files;
  
  ### @Embeddable
  - 엔티티에서 Occupation, Year 과 같이 커리어를 알기 위해 가지는 컬럼들을 하나의 객체로 묶어 StudyNeedCareer로 만들면 객체지향적으로 설계 할 수 있다.
  - @Embeddable은 타입의 값을 정의하는 곳에 표시한다.
  
>   ```
@Getter
@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StudyNeedCareer {
    private String occupation;
    private int year;
    private StudyNeedCareer(String occupation, int year) {
        this.occupation = occupation;
        this.year = year;
    }
    public static final int MIN_YEAR = 0;
    public static StudyNeedCareer create(String occupation, int year) {
       require(Strings.isNotBlank(occupation));
        require(year >= MIN_YEAR);
        return new StudyNeedCareer(occupation, year);
    }
}

@Embedded

  • 값 타입을 사용하는 곳에 표시 한다.
  • 재사용, 높은 응집도의 대한 장점이 있다.
    @Entity
    @Getter
    @NoArgsConstructor(access = PROTECTED)
    public class Study {
      @Id
      @GeneratedValue(strategy = IDENTITY)
      private Long id;
      private String name;
      private String info;
      private int maxMembersSize;
      @ElementCollection
      @Enumerated(STRING)
      private List<TechStack> techStackList;
      @Enumerated(STRING)
      private StudyDifficulty difficulty;
      @Embedded
      private StudyPeriod period;
      @Embedded
      private StudyNeedCareer needCareer;
  
  
  refference
  https://dandev.tistory.com/m/entry/JPA-Embedded-Embeddable%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C-%F0%9F%A4%94
  

0개의 댓글