JPA에서의 엔티티 매핑에대해 알아봅니다.
엔티티 매핑이란 객체와 테이블 사이의 관계나 속성을 지정할 수 있도록 매핑하는 것입니다.
JPA가 관리하는 클래스입니다.
JPA를 사용하여 테이블과 매핑할 클래스는 @Entity가 반드시 필요합니다.
속성: name
주의사항
엔티티와 매핑할 테이블을 정합니다.
속성
uniqueConstraints 속성
@Entity
@Table(name = "MEMBER", uniqueConstraints = @UniqueConstraint(
name = "제약조건의 별칭",
columnNames = {"ADDRESS", "NAME"} // 대상지정
))
@Getter
@NoArgsConstructor(access =AccessLevel.PROTECTED)
public class Member {
...
}
참고 @Entity와 @Table의 차이는?
@Entity(name = “”)는 말 그대로 엔티티의 이름을 정할때 사용합니다.
@Table(name = “”)는 데이터베이스에 생성될 테이블의 이름을 지정할 때 사용합니다.
만약 테이블이 없고 엔티티만 존재하면 엔티티에 의해서 테이블과 엔티티의 이름이 결정됩니다.
@Id는 기본키 매핑에 사용합니다.
@Id 어노테이션을 사용하여 기본키를 직접 할당 할 수 있고, 데이터베이스가 값을 생성하여 사용할 수 도 있습니다.
직접 할당
@Id
private Long id;
Member member1 = new Member();
member1.setId(1);
em.persist(member1);
자동 생성
@Entity
@Getter
@NoArgsConstructor(access =AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy =GenerationType.IDENTITY)
private Long id;
}
참고
시퀀스란 순차적으로 증가하는 데이터를 자동으로 반환하는 데이터베이스 객체를 말합니다.
@Entity
@SequenceGenerator(name = "MEMBER_SEQ_GENERATOR", //GenerateValue에서 사용하는 이름
sequenceName = "MEMBER_SEQ_ID", //데이터베이스에 등록된 이름
initialValue = 1,
allocationSize = 1)
@Getter
@NoArgsConstructor(access =AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy =GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
@SequenceGenerator 속성 정리
allocationSize 주의점
allocationSize의 기본값은 50입니다, 값을 바꾸지 않는다면 데이터베이스에 시퀀스를 호출한 후 50까지는 메모리에서 시퀀스값을 저장한 이후 가상으로 증가시키며 관리합니다. 그리고 51이 되는 순간 시퀀스를 한 번 더 호출한 이후 값으로부터 50만큼인 100까지 가상으로 시퀀스 식별자를 관리합니다.
데이터베이스의 시퀀스 증가값이 1인 상태는 allocationSize또한 1으로 맞춰야 합니다.
Key 생성 테이블
CREATE TABLE CUSTOM_SEQUENCE {
sequence_name varchar(255) not null, // 시퀀스 이름
next_val bigint, // 시퀀스 값
primary key (sequence_name)
}
@TableGenerator을 사용하여 매핑합니다.
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "CUSTOM_SEQUNECES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy =GenerationType.TABLE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
해당 전략은 SEQUNCES 전략과 내부 동작이 같습니다.
pkColumnsValue의 시퀀스 이름을 Table의 sequence_name 컬럼에 생성해줍니다.
next_val의 Column이 값이 증가합니다, 만약 값이 없을 시 JPA가 INSERT 하면서 초기화를 하므로 값을 미리 넣어둘 필요는 없습니다.
public class Member {
@Id
@GeneratedValue(strategy =GenerationType.AUTO)
private Long id;
}
AUTO 전략은 GenerateValue의 기본값입니다.
해당 전략은 데이터베이스가 바뀌어도 코드를 수정할 필요가 없기 때문에 키 생성 전략이 확정되지 않은 개발 초기나 프로토타입 개발 시에 편리하게 이용이 가능합니다.
만약 AUTO로 SEQUENCE 또는 TABLE 전략을 사용시 에는 Sequnce나 키 생성 TABLE을 미리 생성해 두어야 합니다.
기본 키 제약조건
기본키 2가지 전략
자연키 보다는 대리키를 사용합니다.
현재에 자연 키가 조건을 만족을 하여도 미래에는 누락, 변경이 될 수도 있다.