@Entity : @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. (기본 생성자 필수)
@Table : 엔티티와 매핑할 테이블 지정.
- name : 매핑할 테이블 이름 지정
- uniqueConstraints : DDL 생성 시에 유니크 제약 조건 생성
데이터베이스 스키마 자동 생성
생성된 DDL은 개발 장비에서만 사용해야 한다. create/update 옵션
검증에서는 validate 옵션 정도
운영은 위험하다. none
DDL 생성 기능
DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다
제약조건 추가 : @Column(nullable = false, length = 10)
유니크 제약조건 추가 : @Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )})
필드와 컬럼 매핑
@Column : 컬럼 매핑 시 옵션 추가할 경우 사용
@Enumerated : enum 타입 매핑임을 명시한다 (주의! 기본값인 ORDINAL 사용X ) - EnumType.ORDINAL: enum 순서를 데이터베이스에 저장 (0,1,2,, enum의 순서를 바꾸면 꼬인다!) - EnumType.STRING: enum 이름을 데이터베이스에 저장
@Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시. 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때)
기본 키 매핑
- 직접 할당 : @Id만 사용
- 자동 생성 : @GeneratedValue 추가. 키 값을 설정하면 insert가 안된다. 비워둬야한다.
생성키 전략
IDENTITY: 데이터베이스에 위임, MYSQL 계열 (예: MySQL의 AUTO_ INCREMENT) DB에 insert 시점에 id값을 알 수 있으므로, IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회하여 객체에 setting하고 영속성 컨텍스트에 저장한다. [단점] Id가 무조건 따져야하므로 영속성 컨텍스트에 등록되는 순간 DB에 쿼리가 날라가서 Insert 된다.그래서 batch insert를 못 한다.. 채번을 해서 넣어야하니까.. 10번이면 10번 다 넣어야 한다.
SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용, ORACLE 계열. @SequenceGenerator 필요. 마찬가지로DB에서 시퀀스 값을 가져와서 객체에 id에 할당 후 영속성 컨텍스트에들어간다. allocationSize : 시퀀스 한 번 호출에 증가하는 수. 성능 최적화에 사용됨. 기본값 50으로,매번 시퀀스 값을 DB에서 읽어오지 않기 위해 50개를 확보해두는 개념. (다른 서버에서는 51~100) 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다 단점: 귀찮다
마찬가지로 DB에서 시퀀스 값을 가져와서 객체에 id에 할당 후 영속성 컨텍스트에 들어간다. allocationSize : 시퀀스 한 번 호출에 증가하는 수. 성능 최적화에 사용됨. 기본값 50으로, 매번 시퀀스 값을 DB에서 읽어오지 않기 위해 50개를 확보해두는 개념. (다른 서버에서는 51~100) 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다
TABLE: 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략. 모든 DB에서 사용 가능하나, 성능에 좋지 않다. @TableGenerator 필요.