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