分类
Spring Data Spring Persistence

Spring Data JPA设置字段默认值的两种方法

jpa-default-column-values JPA

1. 简介

本文将介绍如何在JPA中定义数据列的默认值。
通常有两种方式来实现默认值的定义:在实体类中设置默认值以及使用JPA注解直接操作数据表。

2. 实体类

第一种方法是直接在实体中定义:

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

此时,当我们使用new关键字来实例化实体时,实体的各个字段将以默认值填充:

@Test
void saveUser_shouldSaveWithDefaultFieldValues() {
    User user = new User();
    user = userRepository.save(user);

    assertEquals(user.getName(), "Code demo");
    assertEquals(user.getAge(), 25);
    assertFalse(user.getLocked());
}

使用方法设置的默认值并未在数据表中定义中生效,查看相应的SQL语句如下:

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

由以上SQL可知,该方法实际上并没有为数据表中的字段设置默认值,所以如果我们在代码中手动的将某个字段设置为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());
}

3. 定义数据表

在JPA中,我们可以使用@Column注解的columnDefinition参数来定义数据表字段的默认值:

@Entity
public class User {
    @Id
    Long id;

    @Column(columnDefinition = "varchar(255) default 'Code demo'")
    private String name;

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

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

使用上述方法定义后,JPA将对应生成以下SQL语句:

create table user
(
    id     bigint not null constraint user_pkey primary key,
    name   varchar(255) default 'Code demo',
    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());
}

值得注意的是:使用该方案在新建数据时,我们无法将某个字段的值设置null。因为如果我们将某个字段的值设置为null,则在进行数据保存操作时,将会以默认值来覆盖null值。

4. 总结

本文着重介绍了两个设置数据字段默认值的方法,在实际的应用中,还需要结合实际的情景来选择具体合适哪种方案。

https://www.baeldung.com/jpa-default-column-values