@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