프로그래밍/Spring & Spring boot

[Spring/JPA] Mapping (2) @SequenceGenerator , @TableGenerator, @Embeddable, @IdClass

pupu91 2022. 9. 23. 17:39
반응형

 


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
				+ "]";
	}



}
반응형