(2) 연관관계 사용
Last update: a year ago by nowwaterReading time: 2 min
연관관계를 등록, 수정, 삭제할 수 있다.
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 -> team1em.persist(member1);//회원2 저장Member member2 = new Member(101L, "회원2");member2.setTeam(team1); //연관관계 설정 member2 -> team1em.persist(member2);}
JPA에서 엔티티를 저장할 때 연관된 모든 엔티티는 영속 상태여야 한다.
MEMBER_ID | NAME | TEAM_ID | TEAM_NAME |
---|---|---|---|
member1 | 회원1 | team1 | 팀 1 |
member2 | 회원2 | team1 | 팀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());}}// 결과ㅣ [query] member.username=회원1// 결과ㅣ [query] member.username=회원2// 실행되는 쿼리SELECT M.* FROM MEMBER MEMBERINNER JOINTEAM TEAM ON MEMBER.TEAM_ID = TEAM1_.IDWHERETEAM1_.NAME='팀1'
5.2.3 수정
연관관계를 수정하는 코드
private static void updateRelation(EntityManager em) {// 새로운 팀2Team 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); //연관관계 제거}// 실제 SQLUPDATE MEMBERSETTEAM_ID = NULL, ...WHEREID = 'member1'
5.2.5 연관된 엔티티 삭제
연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 한다.
그렇지 않으면 외래 키 제약조건으로 인해 데이터베이스에서 오류가 발생한다.
member1.setTeam(null); // 회원1 연관관계 제거member2.setTeam(null); // 회원2 연관관계 제거em.remove(team); // 팀 삭제