테이블 : 외래 키로 조인을 사용하여 연관된 테이블을 찾는다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
@Column(name = "TEAM_ID") // @@@ 외래 키를 필드로
private Long teamId;
…
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
…
}
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeamId(team.getId()); // @@@ 참조가 아닌 외래키를 저장
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//연관관계가 없음
Team findTeam = em.find(Team.class, team.getId());
객체 : 참조를 사용하여 연관된 객체를 찾는다.
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team; // @@@ 참조를 필드로
…
//팀 저장
Team team = new Team();
team.setName("TeamA");
em.persist(team);
//회원 저장
Member member = new Member();
member.setName("member1");
member.setTeam(team); // @@@ 단방향 연관관계 설정, 참조 저장
em.persist(member);
//조회
Member findMember = em.find(Member.class, member.getId());
//참조를 사용해서 연관관계 조회
Team findTeam = findMember.getTeam();
테이블일 경우, FK만 써주면 끝나지만 이건 테이블이 아니다.
정방향, 역방향 모두 값 넣어줘야 한다.
Team team = new Team();
team.setName("TeamA");
em.persist(team);
Member member = new Member();
member.setName("member1");
// 보통 얘까지만 하고 넘어가는 경우가 많다.
// (연관관계의 주인이 아니므로 setter를 안해줌 -> 연관관계 편의 메소드를 만들어서 쓰자.)
team.getMembers().add(member);
//연관관계의 주인에 값 설정
member.setTeam(team); //**
em.persist(member);
단방향
@Entity // 1
public class Team {
@Id @GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
}
@Entity // 다
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@ManyToOne
@JoinColumn(name = "team_id") // @ 어떤 컬럼이랑 매핑되었는지 알려준다. 이 필드가 연관관계의 주인이다. (다->1)
private Team team;
private String username;
}
양방향
@Entity // 1
public class Team {
@Id @GeneratedValue
@Column(name = "team_id")
private Long id;
@OneToMany(mappedBy = "team") // @@@ mappedBy 속성을 통해, 연관관계의 주인인 Member.team과 매핑해준다. (1->다)
List<Member> members = new ArrayList<>();
private String name;
}
@Entity // 다
public class Member {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
@ManyToOne
@JoinColumn(name = "team_id") // @ 어떤 컬럼이랑 매핑되었는지 알려준다. 이 필드가 연관관계의 주인이다. (다->1)
private Team team;
private String username;
}