[JPA]앤티티 매핑

Updated:

객체와 테이블 매핑 @Entity, @Table

@Entity 가 붙은 클래스를 엔티티라 하고 JPA가 해당 엔티티를 관리한다.

기본 생성자 필수.

name 속성으로 엔티티의 이름을 지정해 줄 수 있지만 클래스 이름을 기본값으로 엔티티 이름을 지정한다.

@Table(name = "MBR", indexes = @Index (columnList = "firstName"))

엔티티와 매핑할 DB의 테이블 이름을 name 속성으로 지정한다.

firstName 열을 사용해서 첫 번째 인덱스를 선언 하였다.

인덱스에 대한 더 자세한 설명은 다음 글을 참조.

JPA에서 인덱스 정의

indexes를 통해 객체 코드를 보는것 만으로 JPQL 짤 때 사용할 인덱스를 정확히 선택 할 수 있다.

DB 스키마 자동 생성

JPA는 애플리케이션 실행 시점에 DDL을 자동 생성하고, 생성된 DDL을 조금 수정하여 운영서버 테이블을 생성한다.

persistence.xml 파일의 hibernate.hbm2ddl. auto 값을 수정.

운영 장비에 create, create-drop, update 사용 x

개발 초기 - create or update

테스트 서버 - validate

운영 서버 - none

필드와 컬럼 매핑 @Column

@Column(nullable = false, length = 10)

  • not null, 10자 길이 제한
@Entity
public class Owner {
		
	@Id
	private Long id;
		
	@Column(name = "name") // DB 속성 이름은 
    name
	private String username; // 엔티티 
    username과 DB의 name 칼럼 매핑
		
	private Integer age;
		
	@Enumerated(EnumType.STRING) // Enum 
    타입엔 String 사용
	private Stage stage;

	@Temporal(TemporalType.TIMESTAMP) // 
    LocalDate, LocalDateTime엔 생략 가능.
	private LocalDateTime createdDate;

	@Lob // varchar를 넘어선 text 혹은 컨텐츠 삽입에 사용
	private String description;

기본 키 매핑 @Id

해당 필드값을 엔티티의 Pk 값으로 지정.

@GeneratedValue(strategy = GenerationType.AUTO)

속성

  • IDENTITY : DB에 정책 위임. MySql
  • SEQUENCE : DB 시퀀스 오브젝트 사용. Oracle
    • @SequenceGenerator 필요
  • TABLE : 키 생성용 테이블 사용.
    • @TableGenerator 필요
  • AUTO : 디폴트값. 방언에 따라 자동 지정.

IDENTITY 전략

기본 키 생성을 DB에 위임한다.

MySql의 AUTO_INCREMENT

@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // id값을 세팅해선 안됨(null). 쿼리가 날라오면 
DB에서 알아서 Id값 세팅.

이 전략의 경우, id값을 세팅해 주지 않기 때문에 영속성 컨텍스트에 저장되지 못한다.

때문에 trasaction.commit() 시점이 아닌

em.persist() 시점에 INSERT 쿼리가 실행되고 DB에서 식별자를 조회해 온다.

또한 지연 쓰기와 같은 영속성 컨텍스트의 특징들을 사용하지 못한다.

SEQUENCE 전략

유일 값을 순서대로 생성하는 DB 오브젝트. 버퍼링이 가능하다.

@Entity
@SequenceGenerator(
	name = "OWNER_SEQ_GENERATOR", // 식별자 생성기 이름
	sequenceName = "OWNER_SEQ", // 매핑할 DB 시퀀스 이름
	initialValue = 1, allocationSize = 1)
public class Owner {
			
	@Id @GeneratedValue(strategy = GenerationType.SEQUENCE,
	                    generator = "OWNER_SEQ_GENERATOR)
	private Long id;

initialValue : DDL 생성시에만 사용됨. 시퀀스 DDL 생성시 처음 시작하는 수 지정.

allocationSize : 시퀀스 한번 호출에 증가하는 수.

DB 시퀀스 값이 하나씩 증가하도록 설정 되어 있으면 이 값은 반드시 1로 설정.

DB에서 메모리로 allocationSize 만큼 끌고 오기 때문에 성능 최적화 가능.

TABLE 전략

키 생성 전용 테이블을 하나 만들어서 DB 시퀀스 처럼 사용.

모든 DB에 적용 가능하지만 성능 이슈가 있다.

Leave a comment