728x90
1. 연관관계 매핑 (다대일, 단방향매핑)
JPA를 사용하여 객체끼리의 연관관계, 테이블끼리의 연관관계가 아닌!!
객체와 테이블을 매핑해보자!!
매핑한 회원엔티티
@Entity
public class Member {
@Id
@Column (name = "MEMBER_ID")
private String id;
private String username;
//연관관계매핑
@ManyToOne
@JoinColumn (name = "TEAM_ID")
private Team team;
//연관관계설정
public void setTeam(Team team) {
this.team = team;
}
//Getter, Setter ...
}
매핑한 팀 엔티티
@Entity
public class Team {
@Id
@Column (name = "TEAM_ID")
private String id;
private String name;
//Getter, Setter...
}
@ManyToOne
다대일( N:1 ) 관계라는 매핑정보.
회원과 팀은 다대일 관계이다.
@JoinColumn (name = "TEAM_ID")
조인컬럼은 외래키를 매핑할 때 사용
name 속성에는 매핑할 외래키 이름을 지정..
회원과 팀 테이블은 TEAM_ID 외래키로 연관관계를 맺음.
2. 연관관계 사용
1) 저장
** 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);
Member member2= new Member("member2","회원2");
member2.setTeam(team1); //연관관계설정 member2 -> team1
em.persist(member2);
}
JPA는 참조한 팀의 식별자(Team.id)를 외래키로 사용해서 적절한 등록쿼리를 생성한다.
이때 실행된 SQL
INSERT INTO TEAM (TEAM_ID, NAME) VALUES ('team1','팀1')
INSERT INTO TEAM (MEMBER_ID, NAME, TEAM_ID) VALUES ('member1','회원1','team1');
INSERT INTO TEAM (MEMBER_ID, NAME, TEAM_ID) VALUES ('member2','회원2','team1');
2) 조회
연관관계가 있는 엔티티를 조회하는 방법
- 객체 그래프 탐색
- 객체지향 쿼리 사용 JPQL
▼객체 그래프 탐색
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
System.out.println("팀이름 = " + team.getName());
▼객체 지향 쿼리 사용 JPQL
JPQL 조인검색
private static void queryLogicJoin(EntityManager em) {
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();
for (Member member : resultList) {
System.out.prinltn("[query] member.username = " + member.getUsername());
}
}
결과
[query] member.username=회원1
[query] member.username=회원2
3) 수정
팀1 소속이던 회원을 새로운팀2에 소속하도록 수정하기
연관관계를 수정하는 코드
private static void updateRelation(EntityManager em) {
Team team2 = new Team("team2", "팀2");
em.persist(team2);
Member member = em.find(Member.class, "member1");
member.setTeam(team2);
}
4.삭제
연관관계를 삭제하는 코드
private static void deleteRelation(EntityManager em) {
Member member1 = em.find(Member.class, "member1");
member1.setTeam(null); //연관관계 제거
}
연관된 엔티티를 삭제하려면 연관관계를 먼저 제거 하고 삭제해야한다!!
ex) 팀1에는 회원1과 회원2가 소속되어있다. 이때 팀1을 삭제하려면 연관관계를 먼저 끊어야한다.
member1.setTeam(null);
member2.setTeam(null);
em.remove(team);
'JPA' 카테고리의 다른 글
JPA시작(11)_다양한 연관관계 매핑(실전예제 공부) (0) | 2021.06.09 |
---|---|
JPA시작(10)_연관관계 매핑(N:1 / 1:N 양방향) (2) | 2021.06.08 |
JPA시작(8)_객체 연관관계 / 테이블 연관관계 (0) | 2021.06.08 |
JPA시작(7)_필드와 컬럼 매핑_속성에 따른 DDL 생성확인 @Column, @Enumerated, @Temporal, @Lob, @Transient, @Access (0) | 2021.06.07 |
JPA시작(6)_기본키 매핑 (직접할당, 자동생성) (0) | 2021.06.07 |