목차
객체와 테이블이 관계를 맺는 차이
객체의 양방향 관계는 사실 양방향 관계가 아니라 서로다른 단방향 관계 2개 다. 테이블은 외래키 하나 로 두 테이블의 연관관계를 관리한다.
객체 : 연관관계 2개 (단방향 2개)
회원 —> 팀 연관관계 1개 (단방향)
팀 —> 회원 연관관계 1개 (단방향)
테이블 : 연관관계 1개 (양방향 1개)
양방향 연관관계로 설계하기 1:N 연관관계 Mapping
OneToMany 어노테이션을 이용해 1:N 연관관계를 Mapping 한다.
mappedBy 속성을 이용해 연관된 Entity 클래스 내 field 이름을 넣어준다.
@Entity public class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList <>(); }
N:1 연관관계 Mapping
ManyToOne 어노테이션과 JoinColumn 어노테이션을 이용해 N:1 연관관계를 Mapping 한다.
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "MEMBER_ID") private long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; }
JoinColumn 어노테이션을 이용한 외래키 관계 명시하기
Forign Key(외래 키) 생성시 JoinColumn 을 이용해 연관관계를 명시할 경우 Forign Key(외래 키) 기본 값은 필드명 + _ + 참조하는 테이블의 컬럼명 으로 생성된다.
@Entity public class Member { @Id private long id; private String username; @ManyToOne @JoinColumn private Team team; }
외래키 생성시 JoinColumn 에 name 속성 을 이용할 경우 외래키는 name 속성에 명시된 값으로 생성되는 것을 확인할 수 있다.
@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "MEMBER_ID") private long id; @Column(name = "USERNAME") private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; }
Mapping된 데이터 가져오기 Team team = new Team ();team.setName("TeamA" ); entityManager.persist(team); Member member = new Member ();member.setUsername("member1" ); member.setTeam(team); entityManager.persist(member); entityManager.flush(); entityManager.clear(); Member findMember = entityManager.find(Member.class, member.getId()); List<Member> members = findMember.getTeam().getMembers(); for (Member m : members) { System.out.println("m = " + m.getUsername()); }