자바 ORM 표준 JPA 프로그래밍 공부 기록
@Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "name")
private String userName;
private Integer age;
@Enumerated(EnumType.STRING) //enum 타입 매핑
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) //날짜 타입 매핑
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob //BLOB, CLOB 매핑
private String description;
public Member(){
}
}
기본 키 생성을 DB에 위임한다.
=> DB에 값을 저장하고 나서야 기본 키 값을 구할 수 있을 때 사용
Entity가 영속상태가 되려면 반드시 식별자가 필요하다. 그런데 IDENTITY 전략은 DB에 저장해야 식별자를 알 수 있으므로 persist()했을 때 바로 DB에 저장된다. 즉 트랜잭션을 지원하는 쓰기 지연이 동작하지 않는다.
데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한
데이터베이스 오브젝트
persist
호출할 때, 먼저 DB 시퀀스를 사용해서 식별자를 조회한다. 그리고 해당 식별자를 Entity에 할당한 후에 Entity를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 flush
가 일어나면 Entity를 DB에 저장한다.
<-> IDENTITY 전략과의 차이
IDENTITY 전략은 먼저 Entity를 DB에 저장한 후에 식별자를 조회해서 Entity의 식별자에 할당한다.
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략