1:1(OneToOne)매핑
과 1:N(OneToMany)
에 대해 알아보자
1:1관계는 양쪽이 서로 하나의 관계를 가지는 경우이다. FK가 어느 테이블에 있든, 양방향 조회가 가능하다.
@Entity
@SequenceGenerator(name="member_seq_gen", sequenceName="member_seq_id"
, initialValue=1, allocationSize=50)
public class Member {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="member_seq_gen")
@Column(name="member_id")
private Long memberId;
@Column(length=20)
private String name;
@OneToOne
@JoinColumn(name="team_id")
private Team teamId;
}
@Entity
를 통해 모든 변수를 컬럼으로 만들 수 있다.@Column
어노테이션은 생략 가능하나 컬럼명을 지정하고 싶을 때 명시적으로 사용한다. 그 외에, 길이를 지정할 때도 사용한다. (컬럼명은 보통 언더바를 이용한 team_id
와 같은 형태를 선호하니, 참고하도록 하자.)@Entity
@SequenceGenerator(name="team_seq_gen", sequenceName="team_seq_id"
, initialValue=1, allocationSize=50)
public class Team {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="team_seq_gen")
@Column(name="team_id")
private Long teamId;
@Column(length=20, name="team_name")
private String teamName;
}
@OneToMany
을 선언한 쪽에서 mappedBy
속성을 지정해주어야 한다.
@Entity
@SequenceGenerator(name="member_seq_gen", sequenceName="member_seq_id"
, initialValue=1, allocationSize=50)
public class Member {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="member_seq_gen")
@Column(name="member_id")
private Long memberId;
@Column(length=20)
private String name;
@ManyToOne
@JoinColumn(name="team_id")
private Team teamId;
}
@JoinColumn(name = "team_id)
FK를 매핑할 때 사용하는 어노테이션으로, name
속성에는 매핑할 FK이름을 지정한다.
해당 어노테이션을 생략할 경우 아래와 같은 전략에 따라 외래 키를 매핑한다
⇒ 필드명 + "_" + 참조하는 테이블의 @Id 컬럼명
@Entity
@SequenceGenerator(name="team_seq_gen", sequenceName="team_seq_id"
, initialValue=1, allocationSize=50)
public class Team {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="team_seq_gen")
@Column(name="team_id")
private Long teamId;
@Column(length=20, name="team_name")
private String teamName;
@OneToMany(mappedBy="teamId")
private List<Member> members = new ArrayList<>();
}