단방향 연관관계
- MEMBER와 TEAM 테이블이 있음
- 이때 관계는 1(팀):N(멤버) 임
- JPA를 이용해 테이블을 만들고 관계를 맺어줄 때
// Member
@Entity
public class Member {
@Id
@GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
// @Column(name = "TEAM_ID")
// private Long teamId;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
}
- 위와 같이 멤버의 외래키에 @ManyToOne과 @JoinColumn 어노테이션을 사용해
- 외래키를 지정해줌
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
}
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setTeam(team);
em.persist(member);
Member findMember = em.find(Member.class, member.getId());
Team findTeam = findMember.getTeam();
System.out.println("findTeam = " + findTeam.getName());
- 이렇게 지정해주면 위와 같이 setTeam에 그냥 team을 넣으면 TEAM_ID로 조인시켜서 저장하고 찾아준다.
양방향 연관관계
- 위와 같이 되면 Member와 Team객체는 서로 알 방법이 객체지향스럽지 못하다.
- Member에서는 Team이란 필드가 있으니 쉽게 알 수 있지만, Team에서는 Member를 조회하려면
- 객체지향스럽지 못하게 조회할 수 밖에 없다.
- 테이블에서는 외래키를 이용해 양쪽에서 조인을 사용해 알 수 있다
- 이를 해결하기 위해 아래와 같이 한다.
@Entity
public class Team {
@Id
@GeneratedValue
@Column(name = "TEAM_ID")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
- 위와 같이 팀에서 멤버를 조회할 수 있도록 리스트로 members라는 변수를 만들고
- @OneToMany(mappedBy = "team")으로 어노테이션을 달아준다.
- 이러면 아래와 같이 사용하여 조회할 수 있다.
Member findMember = em.find(Member.class, member.getId());
List<Member> members = findMember.getTeam().getMembers();
for (Member member1 : members) {
System.out.println("member1 = " + member1);
}
연관관계의 주인
- 이 때, 누가 주인 역할을 하냐. 즉, Team과 Member 둘 다 서로의 값을 참조하고 있다.
- 이 때 어떤 멤버가 다른 팀을 간다면, 어느 쪽을 수정해야 하나. 둘 다 수정해야 맞다.
- 이 때 중요한게 연관관계의 주인이다.
- 주인은 N(외래키를 가지고있는 놈)으로 한다.
'스프링' 카테고리의 다른 글
[스프링] S3 라이브러리 endpoint 에러 (0) | 2023.05.01 |
---|---|
[스프링] MySQL 8.0 Public Key Retrieval is not allowed 에러 (0) | 2023.04.29 |
[스프링 부트] redis 초간단 사용법 (0) | 2023.04.24 |
[자바 orm 표준 jpa 프로그래밍] 코드 정리 - 2 (0) | 2023.04.12 |
[자바 orm 표준 jpa 프로그래밍] 코드 정리 - 1 (0) | 2023.04.12 |