JPA Entity 관련 Annotation

@Enumerate

Enumerate는 JPA에 사용 시 명확히 설정하지 않으면 예기치 못한 에러를 초래할 수 있다.

예를 들어 아래와 같이 Gender enum을 만들었다.

1
2
3
4
5
6
public enum Gender {

MALE,

FEMALE
}

Entity에 Gender field를 추가하고 테스트 코드를 통해 확인해보자.

UserRepository 인터페이스에 @Query를 통해 findRowRecord()라는 custom 쿼리를 작성하였으므로 참고하길 바란다.

1
2
@Query(value = "select * from user limit 1", nativeQuery = true)
Map<String, Object> findRowRecord(Long id);
1
2
3
4
5
6
7
8
9
10
@Test
void enumTest(){
User user = userRepository.findById(1L).orElseThrow(RuntimeException::new);
user.setGender(Gender.MALE);
userRepository.save(user);

userRepository.findAll().forEach(System.out::println);

System.out.println(userRepository.findRowRecord(1L).get("gender"));
}

Enumerate ORDINAL
그 결과 위와 같이 findAll()을 해서 조회할 때는 gender=MALE로 입력이 돼었지만, gender의 값을 조회하면 0이라는 값이 나온다.

EnumType defaule값
Enumerate의 EnumType의 default 값은 ORDINAL이다. zero-base로 값의 index를 설정한다.

위에서 MALE이 0번째로 설정되어 0이 출력된 것이다.

ORDINAL을 사용하면 추후에 Enum 내의 순서가 바뀌면 index값이 달라지게 되고 에러를 초래할 수 있다.

Enumerate String

1
2
3
4
5
6
7
8
9
10
11
12
13

---

### @Table

`테이블과 관련된` Annotation으로 이름, Index, 제약조건 등을 설정할 수 있다.

uniqueConstraints는 여러 column을 사용해 `unique한 복합 column`을 생성하도록 한다.

```java
@Table(name = "user",
indexes = {@Index(columnList="name")},
uniqueConstraints = {@UniqueConstraint(columnNames = "email")})

@Column

Field의 각 속성을 지정하는 Field-scope의 Annotation이다.

과거에는 Column 이름을 모음을 제거하고 설정하는 경우가 많았다. Field name과 Column name을 분리하기 위해 사용된다.

nullable 속성도 자주 사용된다. DDL을 호출할 때 not null column을 만들기 위해 설정한다.

  • 일반적인 조회 쿼리에서 validation을 하지 않는다.

Column이 단독적으로 unique해야 한다면 @Column의 속성에 추가할 수 있다.

insertable, updateable 속성은 DDL 외에 DML에도 영향을 받는다.

1
2
@Column(name = "crtdat", nullable = false)
private LocalDate createdAt;

@Transient

Transient는 JPA의 Entity에서 DB의 column외의 추가 field를 갖고 싶을 때 추가해준다.

아래와 같이 설정하면 쿼리문을 실행할 때 DB에 반영되지 않고, JPA에서만 사용된다.

1
2
@Transient
private String secret;
Author

Inwoo Jeong

Posted on

2021-11-10

Updated on

2021-11-10

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글