엔티티들은 대부분 다른 엔티티와 연관관계가 있다. 그런데 객체는 참조(주소)를 사용해서 관계를 맺고 테이블은 외래키를 사용해서 관계를 맺는다. 따라서 이번 장에서는 객체의 참조와 테이블의 외래키를 매핑하는 것을 목표로 한다.

5.1 단방향 연관관계

5.1.1 순수한 객체 연관관계

public class Member {

		private String id;
		private String password;
	
		private Team team; // Team 의 참조를 보관

		public void setTeam(Team team) {
				this.team = team;
		}

		...
}

public class Team {

		private String id;
		private String name;

		...
}

5.1.2 테이블 연관관계

CREATE TABLE MEMBER (
		MEMBER_ID VARCHAR(255) NOT NULL,
		TEAM_ID VARCHAR(255),
		USERNAME VARCHAR(255),
		PRIMARY KEY (MEMBER_ID
)

CREATE TABLE TEAM (
		TEAM_ID VARCHAR(255) NOT NULL,
		NAME VARCHAR(255),
		PRIMARY KEY (TEAM_ID)
)

ALTER TABLE MEMBER ADD CONSTRAINT FK_MEMBER_TEAM
		FOREIGN KEY (TEAM_ID)
		REFERENCES TEAM

5.1.3 객체 관계 매핑

@Entity
public class Member {

		@Id
		@Column(name = "MEMBER_ID")
		private String id;

		private String username;

		// 연관관계 매핑
		@ManyToOne
		@JoinColumn(name = "TEAM_ID")
		private Team team;

		// 연관관계 설정
		public void setTeam(Team team) {
				this.team = team;
		}

		...
}

@Entity
public class Team {

		@Id
		@Column(name = "TEAM_ID")
		private String id;

		private String name;

		...
}

5.3 양방향 연관관계

일대다 관계는 여러 건과 연관관계를 맺을 수 있으므로 컬렉션 을 사용해야 한다.

5.3.1 양방향 연관관계 매핑

@Entity
public class Team {

		@Id
		@Column(name = "TEAM_ID")
		private String id;

		private String name;

		// 추가
		@OneToMany(mappedBy = "team")
		private List<Member> members = new ArrayList<Member>();

		...
}

mappedBy 속성은 양방향 매핑일 때 사용하는데 반대쪽 매핑의 필드 이름을 값으로 주면 된다. 반대쪽 매핑이 Member.team 이므로 team 을 값으로 주었다.

5.4 연관관계 주인