Team이 Mebers를 가지는 데, Member 입장에서는 Team을 참조하지 않아도 된다라는 설계가 나올 수 있다. 객체 입장에서 생각하면 충분히 나올 수 있는 설계이다.
그러나 DB 테이블 입장에서 보면, 무조건 1:N의 N쪽에 외래키가 들어간다.
Team에서 Members가 바뀌면, DB의 Member 테이블에 업데이트 쿼리가 나가는 상황이다.
1:N 단방향 매핑
JPA @OneToMany와 @JoinColumn()을 이용해서 1:N 단방향 매핑코드로 이해하기
Member는 코드상 연관 관계 매핑없고, 팀에서 1:N 단방향 매핑 설정.
@Entity
public class Team {
...
@OneToMany
@JoinColumn(name = "TEAM_ID")
private List members = new ArrayList<>();
...
}
Main.java
...
Member member = new Member();
member.setUsername("NJ");
em.persist(member);
System.out.println("-----멤버 저장");
Team team = new Team();
team.setName("A");
team.getMembers().add(member);
em.persist(team);
System.out.println("-----팀 저장");
tx.commit();
실제 발생한 쿼리
log에서 확인해보면 트랜잭션 커밋 시점에 create one-to-many row로 시작되는 주석과 함께 Member 테이블을 업데이트하는 쿼리가 나간다.
Hibernate:
/* insert hello.jpa.Member
*/
insert
into
Member
(id, age, createdDate, description, lastModifiedDate, roleType, name)
values
(null, ?, ?, ?, ?, ?, ?)
-----멤버 저장
Hibernate:
/* insert hello.jpa.Team
*/
insert
into
Team
(id, name)
values
(null, ?)
-----팀 저장
Hibernate:
/* create one-to-many row hello.jpa.Team.members */
update
Member
set
TEAM_ID=?
where
id=?
일대다 [1:N]
1:N 단방향 매핑
1:N 단방향 매핑
JPA @OneToMany와 @JoinColumn()을 이용해서 1:N 단방향 매핑코드로 이해하기
@OneToMany @JoinColumn(name = "TEAM_ID") private List members = new ArrayList<>();
... }