Default Column Values in JPA

Dev.Hammy·2023년 8월 13일
0

JPA_Hibernate

목록 보기
3/14

SQL 테이블에 직접 정의하는 것과 마찬가지로 엔터티에 기본 속성을 부여하겠다.

엔터티를 생성하는 동안

default 컬럼 값을 지정하는 첫번째 방법은 엔터티의 속성값으로 직접 부여하는 것이다.

@Entity
public class User {
    @Id
    private Long id;
    private String firstName = "John Snow";
    private Integer age = 25;
    private Boolean locked = false;
}

이제 new 연산자로 새 엔터티를 생성할 때마다 우리가 부여한 기본 값이 지정될 것이다.

@Test
void saveUser_shouldSaveWithDefaultFieldValues() {
    User user = new User();
    user = userRepository.save(user);
    
    assertEquals(user.getName(), "John Snow");
    assertEquals(user.getAge(), 25);
    assertFalse(user.getLocked());
}

이 방식에는 한가지 단점이 있다.
SQL 테이블 정의에는 default 값이 지정되어 있지 않다.

create table user
(
    id     bigint not null constraint user_pkey primary key,
    name   varchar(255),
    age    integer,
    locked boolean
);

그러므로 null로 오버라이드 하면 엔터티는 에러 없이 저장될 것이다.

@Test
void saveUser_shouldSaveWithNullName() {
    User user = new User();
    user.setName(null);
    user.setAge(null);
    user.setLocked(null);
    user = userRepository.save(user);

    assertNull(user.getName());
    assertNull(user.getAge());
    assertNull(user.getLocked());
}

스키마 정의에서

SQL 테이블 정의에서 직접 default 값을 생성하려면 @Column 어노테이션을 사용하여 columnDefinition 매개변수에 지정할 수 있다.

@Entity
public class User {
    @Id
    Long id;

    @Column(columnDefinition = "varchar(255) default 'John Snow'")
    private String name;

    @Column(columnDefinition = "integer default 25")
    private Integer age;

    @Column(columnDefinition = "boolean default false")
    private Boolean locked;
}

이 메소드를 사용하면 SQL 테이블 정의에 default 값이 표시된다.

create table user
(
    id     bigint not null constraint user_pkey primary key,
    name   varchar(255) default 'John Snow',
    age    integer      default 35,
    locked boolean      default false
);
@Test
void saveUser_shouldSaveWithDefaultSqlValues() {
    User user = new User();
    user = userRepository.save(user);

    assertEquals(user.getName(), "John Snow");
    assertEquals(user.getAge(), 25);
    assertFalse(user.getLocked());
}

이 메소드를 사용하면 엔터티를 처음 저장할 때 column을 null로 지정할 수 없다. 아무 값도 제공하지 않는다면 자동적으로 default 값이 지정된다.

0개의 댓글