5.2 연관 관계 사용
연관 관계를 등록, 수정, 삭제할 수 있다.
5.2.1 저장
public void testSave() {
//팀1 저장
Team team1 = new Team("team1", "팀1");
em.persist(team1);
//회원1 저장
Member member1 = new Member(100L, "회원1");
member1.setTeam(team1); //연관관계 설정 member1 -> team1
em.persist(member1);
//회원2 저장
Member member2 = new Member(101L, "회원2");
member2.setTeam(team1); //연관관계 설정 member2 -> team1
em.persist(member2);
}
JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
결과
MEMBER_ID | NAME | TEAM_ID | TEAM_NAME |
---|---|---|---|
100 | 회원1 | team1 | 팀1 |
101 | 회원2 | team2 | 팀1 |
5.2.2 조회
엔티티를 조회하는 방법은 2가지
- 객체 그래프 탐색(객체 연관관계를 사용한 조회)
- 객체지향 쿼리 사용(JPQL)
객체 그래프 탐색
Member member = em.find(Member.class, 100L);
Team team = member.getTeam(); //객체 그래프 탐색
System.out.println("팀 이름 = " + team.getName());
객체 지향 쿼리
public static void testJPQL(EntityManager em) {
String jpql1 = "select m from Member m join m.team t where " +
"t.name = :teamName";
List<Member> resultList = em.createQuery(jpql1, Member.class)
.setParameter("teamName", "팀1")
.getResultList();
for (Member member : resultList) {
System.out.println("[query] member.username = " +
member.getUsername());
}
}
5.2.3 수정
연관관계를 수정하는 코드
private static void updateRelation(EntityManager em) {
// 새로운 팀2
Team team2 = new Team("team2", "팀2");
em.persist(team2);
//회원1에 새로운 팀2 설정
Member member = em.find(Member.class, 100L);
member.setTeam(team2);
}
수정은 em.update()
같은 메소드가 없다.
5.2.4 제거
연관관계를 삭제하는 코드
private static void deleteRelation(EntityManager em) {
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); //연관관계 제거
}
실제 SQL
UPDATE MEMBER
SET
TEAM_ID = null, ...
WHERE
ID = 'member1'
5.2.5 연관된 엔티티 삭제
연관된 엔티티를 삭제하려면 먼저 연관관계를 제거하고 삭제해야 한다.
외래 키 제약조건으로 데이터베이스 오류 발생.
member1.setTeam(null); // 회원1 연관관계 제거
member2.setTeam(null); // 회원2 연관관계 제거
em.remove(team); // 팀 삭제