참고
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String name;
// @Column(name = "TEAM_ID")
// private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Team getTeam() {
return team;
}
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
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 Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Member> getMembers() {
return members;
}
public void setMembers(List<Member> members) {
this.members = members;
}
}
사실 객체에서 양방향 연관관계는 없다. 단방향 관계 2개가 존재
테이블은 단방향이든 양방향이든 동일하다. 그 이유는 member는 FK로 PK를 조인하면 되고
팀은 PK와 FK를 조인하면 되기 때문이다.
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID
그렇게 하지 않고 반대로 하면 team.member를 바꾸면 member쪽에서 update 쿼리가 나가는데
엄청 헷갈리기 시작하고 성능적인 이슈가 있다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
ID | USERNAME | TEAM_ID |
---|---|---|
1 | member1 | null |
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
team.getMembers().add(member); //연관관계의 주인에 값 설정
member.setTeam(team); //**
em.persist(member);
ID | USERNAME | TEAM_ID |
---|---|---|
1 | member1 | 2 |
롬복에서 왠만해서 toStrong 만들지 말라
JSON 생성 라이브러리는 Controller에서 만드는데 그때 반환값을 엔티티로 하지 말고 DTO로 하자
이유는 첫째, StackOverflow 둘째, 엔티티는 충분히 변경이 가능한데 엔티티를 반환하면 api spec이
변경된다.
꿀팁은 처음 설계시에 전부 단방향 매핑으로 끝내라! 그리고 application 개발시에 필요 시, 추가하자!