@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
@Builder
@RequiredArgsConstructor
@Table(name = "user", indexes = {@Index(columnList = "name")},uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull
private String name;
@NonNull
private String email;
@Enumerated(value = EnumType.STRING)
private Gender gender;
@Column(updatable = false)
private LocalDateTime createdAt;
@Column(insertable = false)
private LocalDateTime updatedAt;
@Transient
private String testData;
}
예를 들어 위와 같은 Entity 클래스가 있다고 가정해보자.
@GeneratedValue >> ID값을 별다른 설정을 하지않아도 데이터가 증가됨에따라 인덱스를 자동 1씩 증가시켜준다는 어노테이션
@Transiend >> DB에는 삽입하지 않고 그저 로직에서만 확인하고자 할때 사용하는 어노테이션 (주석)
@Column(insertable = false) >> 쿼리를 확인할때 인서트를 치지 않는것을 확인할 수 있다.
@Enumerated(value = EnumType.STRING)
public enum Gender { MALE, FEMALE }
위와 같은 Gender 라는 Enum 배열이 있다고 생각해보자.
만약 아무런 설정없이 Entity 클래스에 Gender라는 Enum 을 넣는다면
쿼리 메소드 실행시 다음과같은 결과가 나온다.
//TEST 메소드//
@DisplayName("4. ENUM")
@Test
void test_4(){
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().get("gender"));
}
//TEST 결과 쿼리//
Hibernate:
select
*
from
user limit 1;
0
여기서 0이 나온이유는 배열의 의미로 MALE은 Gender라는 Enum에서 0번째에 있기 때문이다.
그렇다면 만약
@Enumerated(value = EnumType.STRING)
private Gender gender;
이렇게 Entity에 추가해준다면 결과는
Hibernate:
select
*
from
user limit 1;
MALE
위와 같이 MALE이라는 값이 나오게된다.