연관관계 사용
저장
- JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
public void testSave() {
Team team1 = new Team("team1", "팀1");
em.persist(team1);
Member member1 = new Member("member1", "회원1");
member1.setTeam(team1); // 연관관계 설정 member1 -> team1
em.persist(member1);
}
조회
- 연관관계가 있는 엔티티를 조회하는 방법은 크게 2가지다.
- 객체 그래프 탐색(객체 연관관계를 사용한 조회)
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); // 객체 그래프 탐색
- 객체지향 쿼리 사용(JPQL)
String jpql = "select m from Member m join m.team t where " + "t.name=:teamName";
List<Member> resultList = em.createQuery(jpql, Member.class)
.setParameter("teamName", "팀1")
.getResultList();
- 실행된 SQL과 JPQL을 비교하면 JPQL은 객체(엔티티)를 대상으로 하고 SQL보다 간결하다.
수정
Team team2 = new Team("team2", "팀2");
em.persist(team2);
Member member = em.find(Member.class, "member1");
member.setTeam(team2); // 새로운 팀2 설정
- 단순히 불러온 엔티티의 값만 변경하면 트랜잭션을 커밋할 때 플러시가 일어나면서 변경 감지 기능이 작동한다. 그리고 변경사항을 데이터베이스에 자동으로 반영한다.
연관관계 제거
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); // 연관관계 제거
연관된 엔티티 삭제
- 연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다.
member1.setTeam(null); // 회원1 연관관계 제거
member2.setTeam(null); // 회원2 연관관계 제거
em.remove(team); // 팀 삭제
'공부 기록 > Java' 카테고리의 다른 글
[이펙티브 자바 3/E] 아이템15 - 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2023.08.23 |
---|---|
[JPA] 5장 - 연관관계 매핑 기초(3) - 양방향 연관관계 (0) | 2023.08.18 |
[이펙티브 자바 3/E] 아이템14 - Comparable을 구현할지 고려하라 (0) | 2023.08.09 |
[이펙티브 자바 3/E] 아이템13 - clone 재정의는 주의해서 진행하라 (0) | 2023.08.09 |
[JPA] 5장 - 연관관계 매핑 기초(1) - 단방향 연관관계 (0) | 2023.08.06 |