@Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. JPA를 통해서 DB 테이블과 매핑할 클래스는 @Entity를 붙여줘야 한다.
규칙
- 파라미터가 없는 public 또는 protected 기본 생성자가 있어야 한다.
- final 클래스, final 멤버 변수는 사용할 수 없다. (JPA 표준 스펙에서 막아둠)
@Entity(name="엔티티 이름")
기본값은 클래스 이름이다. 종종, 다른 패키지에 같은 이름을 가진 클래스가 있는데, 엔티티로써 JPA에 의해 관리될 때, 사용하고, 그렇지 않을 경우에는 기본 값을 사용한다.
@Table(name="DB테이블 이름")
매핑할 데이터베이스 테이블 이름을 설정할 수 있다. DB 테이블명에 대한 정해진 전략이 있을 때, 사용한다.
- 데이터베이스 스키마 컬럼과 엔티티 매핑
@Column private String username;
- Enum타입을 데이터베이스에 적용시키고 싶을 때 사용
@Enumerated(EnumType.STRING) private RoleType roleType;
EnumType.ORDINAL도 있지만, 순서를 저장하는 것이기 때문에, 자칫 코드에서 Enum 순서를 변경하면 꼬여버리기 때문에 사용하면 안된다.
- java.util.Date, java.util.Calender의 날짜 타입을 매핑할 때 사용한다.
@Temporal(TemporalType.TIMESTAMP) //DATE, TIME, TIMESTAMP 이렇게 세 개 있다. (Enum) private Date lastModifiedDate;
LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
- 데이터베이스 BLOB, CLOB 컬럼과 매핑한다.
@Lob private String description;
- 데이터베이스와 매핑하지 않고 클래스 내의 어떤 변수를 메모리 내에서만 사용하고 싶을 때
@Transient private Integer temp;
- PK 값을 자동으로 생성하지 않고, 특정한 규칙에 의해 직접 할당할 때 사용한다.
- @Id만 사용
- 직접 엔티티 객체에 @Id가 붙은 멤버변수 값을 세팅해줘야 한다.
- 정해진 전략에 따라 PK 값을 자동 생성한다.
- @Id @GeneratedValue 사용
- mysql의 auto_increment처럼 null을 넣으면 자동으로 데이터베이스가 값을 넣음.
- Oracle에서 주로 사용.
- allocationSize만큼씩 DB에서 이
- 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
- 데이터베이스에 관계 없이 모두 사용할 수 있지만, 성능에 문제가 있음.
데이터베이스 방언에 맞게 IDENTITY, SEQUENCE, TABLE 중에 자동 선택
JPA는 데이터베이스 방언에 맞는 DDL을 애플리케이션 실행 시점에 자동 생성해준다.
@Column(nullable = false, length = 10)
위와 같이 제약 조건을 추가하면 JPA가 이를 고려하여 자동으로 DDL을 생성한다.
그 중 스키마 자동 생성 옵션은 운영할 때는 사용하면 안되고, 혼자 개발할 때, 계속 테이블 새로 생성하고, 수정하고, 힘드니까 이 옵션을 사용하면 좋다.<property name="hibernate.hbm2ddl.auto" value="create" />
보통,
개발 초기 단계에서는 create 또는 update,
테스트 서버에서는 update 또는 validate,
운영 서버에서는 validate 또는 none
을 사용한다.