연관관계 매핑1
JPA는 엔티티가 핵심이라고 보면 되는데 앞의 포스팅에서는 단순히 테이블과 엔티티의 매핑만 확인을 했다. 이번에는 테이블과 테이블의 관계를 엔티티와 엔티티의 관계로 어떻게 표현할 수 있을지에 대해서 알아본다.
MEMBER와 TEAM 테이블이 있다.
MEMBER와 TEAM 테이블은 N:1의 관계에 있다.
테이블은
TEAM 테이블과 MEMBER 테이블로 나뉠테고 MEMBER에 TEAM ID가 외래키로 생성될 것이다.
그리고 데이터베이스에서는 MEMBER.TEAM_ID와 TEAM.ID로 조인을 할 것이다.
바로 지금 다룰 연관관계가 바로 테이블과 테이블의 관계를 엔티티와 엔티티로 매핑하는 것을 의미한다.
객체에는 조인이라는 개념이 없다. 그렇기 때문에 연관관계를 객체지향적으로 맺어줘야 하는데 코드를 보면 아주 쉽게 이해가 된다.
@Entity public class Member { @Id @Column(name = "MEMBER_ID") @GeneratedValue private Long id; @Column private String name; @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; ... }
@Entity public class Team { @Column(name="TEAM_ID") @Id @GeneratedValue private Long id; @Column private String name; ... }
위의 두개의 엔티티를 보면 조인시 컬럼과 컬럼의 매핑을 어노테이션으로 처리하고 있는데
@ManyToOne @JoinColumn(name="TEAM_ID") private Team team;
@ManyToOne를 통해 N:1관계를 명시하고
@JoinColumn 사용하여 연관관계를 맺고 있다.
중요한 점은 변수의 타입이 Team엔티티라는 것이다. 기존 쿼리로 연관관계를 맺기 위해서는 Team테이블에 팀을 저장하고 Team의 id값을 Member테이블의 team_id 컬럼에 저장한다. JPA는 이러한 패러다임의 불일치를 @JoinColumn과 객체 참조를 통해서 해결한다.
Team team = new Team(); team.setName("team1"); em.persist(team); Member member1 = new Member(); member1.setName("멤버1"); member1.setTeam(team); em.persist(member1); Member member2 = new Member(); member2.setName("멤버2"); member2.setTeam(team); em.persist(member2);
위의 코드는 연관관계를 저장하는 코드이다. team을 만들고 setTeam만 해주면 해당 team의 id가 mamber테이블의 team_id와 매핑이 된다.
'Programming > 과거포스팅' 카테고리의 다른 글
자바 람다식(Java Lambda Expression) (0) | 2017.04.23 |
---|---|
[JPA] - 기본 키(Primary Key) 매핑 (0) | 2016.12.19 |
[JPA] - 엔티티 매핑(Entity Mapping) (0) | 2016.12.19 |
[JPA] - 영속성 컨텍스트(persistence context)의 특징 (0) | 2016.12.18 |
[JPA] - 영속성 컨텍스트(persistence context) 와 엔티티의 생명주기 (0) | 2016.12.16 |