이번 섹션은 사실상 JPA를 활용하는 내용보다는 단순히 엔티티 클래스를 정의하는것이 주된 내용이어서 따로 정리를 하지 않으려고 했다.
그러나 엔티티를 혼자 정의해보면서 역시 머리속에서 흐릿해졌거나 ,
제대로 정리되지 않은 부분들이 적지 않은 것 같아,
나중에 다시 복습할 겸 정리를 한다. (결국 제대로 내 지식이 안되었기 때문)
[주요 복습 내용]
1. 엔티티 클래스를 정의하면서 기억해야할 내용들
: 롬복의 어노테이션 @ToString, 연관관계는 반드시 지연로딩! 근데 이유가 뭐였지?
2. 엔티티 클래스의 필드 타입을 Primitive 타입으로 할지 vs Wrapper 클래스 타입으로 할지
: 그 정확한 기준은 뭐고 , 그래서 난 어떤걸 선택했는지
3. 연관관계의 주인 vs 거울
: 주인이냐 , 거울이냐 에 따라 어떤 차이가 있는지
1. [엔티티 클래스를 정의하면서 다시 정리할 부분]
[위의 내용들을 고려하여 정의한 실제 Member, Team 엔티티 클래스]
@Entity
@Getter @Setter
@Table(name = "member")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
private int age; // DB상에 null 이 들어가면 안되는 필드이므로 (null 원천 봉쇄)-> Primitive 타입 사용
@JoinColumn(name = "team_id")
@ManyToOne(fetch = FetchType.LAZY)
private Team team;
/** [생성자] */
public Member(String username) {
this(username, 0);
}
public Member(String username, int age) {
this(username, age, null);
}
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
if(team != null){
changeTeam(team);
}
}
/** [연관관계 편의 메서드] : 이름은 변경메서든데 , 연관관계 편의 메서드로 사용하심 */
public void changeTeam(Team team){
this.team = team;
team.getMembers().add(this);
}
}
@Entity
@Getter @Setter
@Table(name = "team")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "name"})
public class Team {
@Id @GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public Team(String name) {
this.name = name;
}
}
2. [엔티티 필드 타입의 결정 기준]
: Primitive 타입으로 할지 vs Wrapper 클래스 타입으로 할지
결론부터 말하면
그러나 PK의 경우 JPA에서도 Long 타입을 권장한다
관련 글은 https://velog.io/@d-h-k/JPA-Entity-Class-에서-Primitive-Type-을-써야할까-Wrapper-Class-를-사용해야할까 를 참고하면 좋을 것 같다!
어쨌든 그래서 Member의 age 필드는
3. [연관관계 주인 vs 거울]
: 그 본질적인 차이가 뭐였지?