자바 ORM 표준 JPA 프로그래밍 : 교보문고
자바 ORM 표준 JPA 프로그래밍 - 기본편 : 인프런
JPA 를 사용하면 다양한 Annotation 을 접할 수 있다.
이에 대해 알아보자
JPA가 관리하는 Entity 를 명시.
1. 기본 생성자가 반드시 존재해야한다.
` - JPA 에서 reflection 을 사용하기 때문에
2. final, enum, interface, inner 클래스는 Entity 로 사용되지 않는다.
JPA 에서 Query 생성시 테이블 이름을 설정
@Entity
@Table(name = "User")
// Reflection 등을 JPA 에서 사용하기 때문에 기본 생성자가 존재해야한다.
public class Member
{
필드 설정을 위한 다양한 속성을 제공하는 Annotation
property name | description |
---|---|
name | 필드 이름 지정 |
updatable | 필드 수정 가능 여부 |
insertable | 필드 데이터 삽입 가능 여부 |
notNull | 필수 값인지 설정 여부 |
unique | 필드가 unique 값인지 설정 (파악하기 어려워서 잘 사용하지 않음 ) |
length | 필드 길이 |
columnDefinition | 직접 DDL 정의 |
percision, scale | BigDecimalType 에서 소수점 표시 |
DB 는 EnumType 이 존재하지 않기 때문에 해당 Annotation 을 사용
@Enumerated(EnumType.STRING)
private RoleType roleType;
기본값인 EnumType.ORDINAL 를 사용하면 EnumType 에 선언된 순서를 반환한다.
package org.example.javamain.Entity;
public enum RoleType
{
USER, ADMIN;
}
/////////////////////////////////
@Entity
@Table(name = "USR")
@Data
public class UserEntity
{
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
EnumType.ORDINAL 의 경우 ROLETYPE 의 DDL 이 integer 로 정의되었고 DataBase 에서
정수로 저장된 것을 확인할 수 있다.
이때 EnumType 내용이 앞에 추가되면 어떻게 될까?
try
{
UserEntity user = new UserEntity();
user.setId(12L);
user.setUsername("name");
user.setAge(12);
user.setRoleType(RoleType.USER);
user.setCreateDate(new Date());
user.setLastModifiedDate(new Date());
user.setDescriptioin("SFA");
다음과 같이 같은 RoleType.USER 임에도 다른 값이 할당됐다.
정리하면 EnumType.ORDINAL 으로 사용하면
DDL 에서 필드 타입을 INTEGER 로 설정하고 순서가 변경시 같은 값임에도
다른 값이 할당 되기 때문에 EnumType.STRING 을 사용하는 것이 좋다
시간 정보를 저장
DB에는 DATE, TIME, TIMESTAMP 가 존재
현재는 LocalDate, LocalDateTime 이 존재하여 많이 사용하지 않는다.
크기가 큰 필드를 정의하는데 사용
Mapping Type 이 문자열 : CLOB
그 외 : BLOB
테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용
-> DDL 에서 정의되지 않은 것을 볼 수 있다.
Annotation | description |
---|---|
@Entity | JPA가 관리하는 Entity 를 명시 |
@Column | 필드 설정을 위한 다양한 속성을 제공하는 Annotation |
@Enumerated | DB 는 EnumType 이 존재하지 않기 때문에 해당 Annotation 을 사용 |
@Temporal | 테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용 |
@LOB | 크기가 큰 필드를 정의하는데 사용 |
@Transient | 테이블의 필드로 만들고 싶지않은 컬럼을 지정할 때 사용 |