기존 테이블 방식의 연관 관계
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId());
em.persist(member)
//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
Team findTeam = em.find(Team.class, team.getId());
Member가 하나의 팀에 가입할 수 있을 때,
Member가 특정 팀에 가입하기 위해서는 위와같이 teamID를 통해서만 가입과 조회가 가능했다.
하지만 JPA 매핑을 사용하면 이를 더 객체지향적 관계로 변환시킬 수 있다.
단방향 연관관계
@Entity
@Getter @Setter
//@Table(name="USER") /*이렇게 하면 테이블이 USER인 것에 대응된다.*/
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "name", nullable = false) // 소스에서는 username이라고 쓰이지만, 실제 DB에서는 name으로 속성명이 생성됨
private String name;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity @Getter @Setter
public class Team {
@Id
@GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
}
@ManyToOne 어노테이션을 통해 Member 테이블이 Team 테이블에 다대일 단방향 매핑을 했다.
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); //단방향 연관관계 설정, 참조 저장
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
기존 테이블 방식과 달리 ID를 통한 접근이 아닌, 객체를 통한 저장, 조회가 가능해졌다.
양방향 연관관계
@Entity @Getter @Setter
public class Team {
@Id
@GeneratedValue
@Column(name="TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
List<Member> members = new ArrayList<Member>();
}
@OneToMany 어노테이션을 통해 Member 테이블에 일대다 매핑을 한 모습이다.
이를 통해 테이블이 서로를 매핑하여 양방향 연관관계가 성립하게 된다.
//조회
Team findTeam = em.find(Team.class, team.getId());
int memberSize = findTeam.getMembers().size(); //역방향 조회
따라서 위와 같은 조회도 가능해진다.
주의점
일대다 관계에서 '다'의 위치에 있는 테이블이 주인 관계가 되며, 종속 테이블은 주인 테이블과 연결되어 있으나 조회만 가능하고 종속 테이블에서 주인 테이블을 생성하거나 수정할 수 없다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
//역방향(주인이 아닌 방향)만 연관관계 설정
team.getMembers().add(member);
em.persist(member);
team에서 member를 추가하였으나, 실제 Member 테이블에는 해당 데이터가 추가되지 않는다.
'JPA' 카테고리의 다른 글
[JPA] 영속성 전이(CASCADE)와 고아 객체 (0) | 2023.07.17 |
---|---|
[JPA] 프록시와 즉시/지연 로딩 (0) | 2023.07.17 |
[JPA] 필드와 컬럼 매핑 (0) | 2023.07.15 |
[JPA] 객체와 테이블 매핑 (0) | 2023.07.15 |
[JPA] 준영속 상태 (0) | 2023.07.13 |