인프런 강의 < 자바 ORM 표준 JPA 프로그래밍 - 기본편 > 정리
예제
이 예제에서 하나의 팀(1)에 여러 명의 회원(N)이 속하므로 1:N관계이고, 회원은 팀 id를 외래키로 가진다.
객체지향적이지 않다.
참조 대신 외래 키 사용
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(nmae = "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());
// 연관관계 x
Team findTeam = em.find(Team.class, team.getId());
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계 만들 수 없다.
그 이유는 다음과 같다.
참조를 사용해서 연관된 객체를 찾는다객체 연관관계 사용

Team객체를 생성한다.@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(nmae = "USERNAME")
private String name;
/* @Column(name = "TEAM_ID")
private Long teamId; */ teamId x
@ManyToOne // 멤버가 N TEAM이 1이기 때문에
@JoinColumn(name = "TEAM_ID")// 테이블에서의 외래 키를 매핑한다.
private Team team;
}

위의 예제에서 Member에서는 Team을 자유자재로 참조할 수 있지만 Team에서는 Member참조가 불가능 하다.
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") // 팀이 1 회원이 N 이고 Member 객체의 team 이라는 변수에 의해 매핑되어 있다는 뜻
List<Member> members = new ArrayList<Member>(); // add 할때 null 포인트 에러를 피하기 위해 ArrayList로 초기화
}
테이블의 연관관계는 1개!!
객체 연관관계는 양방향 관계지만 서로 다른 단방향 관계 2개라고 봐야 된다.
class Member{
Team team;
}class Team{
Member member;
}
위의 그림처럼 Member테이블로 외래키를 관리할것인지 MEMBER테이블로 관리할것인지 정해야됨
양방향 매핑 규칙
mappedBy 속성 사용X주인은 외래 키가 있는 곳으로 정한다.
< 자료 출처: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >