반응형
PrimaryKeyMapping
1. 기본 키 생성하는 3가지 방법
(1) IDENTITY
기본 키 생성을 데이터베이스에 위임(MySql)
(2) SEQUENCE
데이터베이스 시퀀스를 사용해서 기본키 할당
(3) TABLE
키 생성 테이블을 사용
참고
@Id 적용이 가능한 자바 타입
- 자바 기본형
- 자바 Wrapper 타입
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
2. @SequenceGenerator 어노테이션으로 기본 키 생성
@Entity(name="SequenceMember")
@Table(name="TBL_MEMBER_SECTION03_SUBSECTION01")
@SequenceGenerator(
name="MEMBER_SEQUENCE_GENERATOR", //식별자 생성기 이름
sequenceName="SEQ_MEMBER_NO", //데이터베이스에 등록 되어 있는 시퀀스 이름
initialValue=1, //DDL 처음 생성 시 시작하게 될 값
allocationSize=50 //시퀀스 호출에 증가하는 수
-> 기본 값이 50으로 시퀀스 객체 증가와 별개로 메모리에서 식별자를 할당하여
매번 시퀀스를 호출하지 않도록 하는 성능 최적화를 위한 값이다.
)
public class Member {
@Id
@Column(name="MEMBER_NO")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="MEMBER_SEQUENCE_GENERATOR")
private int memberNo;
}
3. @TableGenerator 어노테이션으로 기본 키 생성
@Entity(name="SequenceTableMember")
@Table(name="TBL_MEMBER_SECTION03_SUBSECTION02")
@TableGenerator(
name="MEMBER_SEQ_TABLE_GENERATOR", //식별자 생성기 이름
table="TBL_MY_SEQUENCES", //데이터베이스에 등록 되어 있는 시퀀스 생성용 테이블 이름
pkColumnValue="My_SEQ_MEMBER_NO", //시퀀스 컬럼명
allocationSize=50 //시퀀스 호출 시 증가하는 수
)
public class Member {
@Id
@Column(name="MEMBER_NO")
@GeneratedValue(strategy=GenerationType.TABLE, generator="MEMBER_SEQ_TABLE_GENERATOR")
private int memberNo;
}
복합키 설정하기
@Embeddable, @IdClass
1. 복합키로 설정하는 2가지 방법
(1) @Embeddable
@Embeddable 클래스에 복합키를 정의하고 엔터티에 @EmbbededId를 이용해 복합키 클래스를 매핑
이 때 @Embeddable 클래스는 영속성 컨텍스트가 고나리하는 엔터티는 아님
주의 할 점은 복합키를 정의한 클래스는 직렬화 처리가 되어 있어야 함
(2) @IdClass
복합키를 필드로 정의한 클래스를 이용해 엔터티 클래스에 복합키에 해당하는 필드에 @Id를 매핑함.
주의할 점은 복합키를 정의한 클래스는 직렬화 처리가 되어 있어야 함.
두 방식 모두 복합키 클래스는 영속성 컨텍스트가 관리하지 않으며 별 다른 차이도 존재하지 않음.
- @Embeddable은 조금 더 객체 지향 다운 방법이고, @IdClass는 관계형 데이터베이스에 가까운 방법
- 복합키를 사용할 시 PK 정보를 담는 클래스는 동등성을 가지는 객체가 동일성을 가지도록 equals와 hashCode가 오버라이딩 되어야 함. 그렇지 않으면 동일한 키 값을 이용해서 객체를 찾으려 할 때 찾지 못하는 현상이 발생 함
=> 이 부분은 4버전까지 빈번히 발생하는 이유여서 5버전에서는 동등 비교를 하도록 내부적으로 구현해둠.
반응형
2. @Embeddable 사용하여 복합키 설정하기
(1) MemberPk Class 생성하여 복합키 설정
@Embeddable
public class MemberPK implements Serializable { // implements Serializable 직렬화처리
@Column(name="MEMBER_NO")
private int memberNo;
@Column(name="MEMBER_ID")
private String memberId;
//두 필드를 묶어서 복합키로 설정
public MemberPK() {}
public MemberPK(int memberNo, String memberId) {
super();
this.memberNo = memberNo;
this.memberId = memberId;
}
public int getMemberNo() {
return memberNo;
}
public void setMemberNo(int memberNo) {
this.memberNo = memberNo;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
@Override
public String toString() {
return "MemberPK [memberNo=" + memberNo + ", memberId=" + memberId + "]";
}
}
(2) Member Entity 에서 복합키 사용
@Entity(name="EmbeddedMember")
@Table(name="TBL_MEMBER_SECTION06_SUBSECTION01")
public class Member {
@EmbeddedId //MemberPK의 두 필드가 복합키로 설정됨
private MemberPK memberPK;
@Column(name="PHONE")
private String phone;
@Column(name="ADDRESS")
private String address;
public Member() {}
public Member(MemberPK memberPK, String phone, String address) {
super();
this.memberPK = memberPK;
this.phone = phone;
this.address = address;
}
public MemberPK getMemberPK() {
return memberPK;
}
public void setMemberPK(MemberPK memberPK) {
this.memberPK = memberPK;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Member [memberPK=" + memberPK + ", phone=" + phone + ", address=" + address + "]";
}
}
3. @IdClass 사용하여 복합키 설정하기
(1) MemberPk에 복합키로 사용할 필드 선언
public class MemberPK implements Serializable {
private int memberNo;
private String memberId;
public MemberPK() {}
public MemberPK(int memberNo, String memberId) {
super();
this.memberNo = memberNo;
this.memberId = memberId;
}
public int getMemberNo() {
return memberNo;
}
public void setMemberNo(int memberNo) {
this.memberNo = memberNo;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
@Override
public String toString() {
return "MemberPK [memberNo=" + memberNo + ", memberId=" + memberId + "]";
}
}
(2) Member Entity 에서 복합키 사용
@Entity(name="IdClassMember")
@Table(name="TBL_MEMBER_SECTION06_SUBSECTION02")
@IdClass(MemberPK.class)
public class Member {
@Id
@Column(name="MEMBER_NO")
private int memberNo;
@Id
@Column(name="MEMBER_ID")
private String memberId;
@Column(name="PHONE")
private String phone;
@Column(name="ADDRESS")
private String address;
public Member() {}
public Member(int memberNo, String memberId, String phone, String address) {
super();
this.memberNo = memberNo;
this.memberId = memberId;
this.phone = phone;
this.address = address;
}
public int getMemberNo() {
return memberNo;
}
public void setMemberNo(int memberNo) {
this.memberNo = memberNo;
}
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Member [memberNo=" + memberNo + ", memberId=" + memberId + ", phone=" + phone + ", address=" + address
+ "]";
}
}
반응형
'프로그래밍 > Spring & Spring boot' 카테고리의 다른 글
[Springboot / 스프링부트] thymeleaf (1) 타임리프 표현식 (0) | 2022.09.26 |
---|---|
[Spring/JPA] Mapping (3) 연관 관계 매핑 (단반향, 양방향) (0) | 2022.09.26 |
[Spring/JPA ] Mapping(1) @Entity, @Table, @Enumerated, @Access (0) | 2022.09.23 |
[Spring/스프링] JPA(Java Persistence API) (0) | 2022.09.23 |
[Spring/스프링] JUnit이란? (0) | 2022.09.20 |