默认值和非空约束
Default values and not null constraints
spring-boot-starter-parent 2.4.1
spring-boot-starter-data-jpa
postgres 12.5
实体的简短摘录:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Branch extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "varchar(255) default ''", nullable = false)
private String name;
@Column(columnDefinition = "varchar(255) default ''")
private String segmentFour;
}
实体生成一个 table 像这样:
就是这样:
ads=# \d clients__branch
Table "public.clients__branch"
Column | Type | Collation | Nullable | Default
-----------------------+------------------------+-----------+----------+----------------------------------
id | integer | | not null | generated by default as identity
name | character varying(255) | | not null | ''::character varying
segment_four | character varying(255) | | | ''::character varying
我们可以看到:
- "name" 不为 null 且具有默认值 ''。
- "segment_one"有默认值,但没有not null约束。
让我们尝试使用它。
让我们填写数据并保存:
Branch branch0 = new Branch();
branch0.setName("Train");
branch0.setSegmentFour("");
Branch branch1 = new Branch();
branch1.setName("Car");
branch1.setSegmentFour(null);
Branch branch2 = new Branch();
branch2.setName("Ship");
结果:
ads=# select id, name, case when segment_four is null then 'null' when segment_four = '' then 'space' end as segment from clients__branch;
id | name | segment
----+---------+---------
1 | Vosst | space
2 | Ryba | null
3 | Admiral | null
问题
我想阻止任何人设置 Null,以防万一
分支 1.
如果我这样组织:
@Column(columnDefinition = "varchar(255) default ''", nullable =
false) private String segmentFour;
然后我得到:
ERROR: null value in column "segment_four" violates not-null constraint
我想要一个默认值(branch2 的代码应该
在 segment_four).
中生成 ''
你能帮帮我吗?
我认为没有直接的方法可以使用 @Column 注释来处理这个问题,但是您可以在 setter 方法中拥有自己的逻辑,如果值为 null
public void setSegmentFour(String segmentFour) {
this.segmentFour = segmentFour == null ? "" : segmentFour;
}
我建议您按以下方式将 @ColumnDefault
与 @DynamicInsert
一起使用:
@Entity
@DynamicInsert
public class Branch extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
@ColumnDefault("''")
private String name;
@Column
@ColumnDefault("''")
private String segmentFour;
// ...
}
然后如果您想使用默认值,只需省略为该字段设置值。
上面的实体使用 @DynamicInsert
注释进行注释,因此 INSERT
语句不包含任何不包含值的实体属性。
请参阅 documentation 中的附加说明。
spring-boot-starter-parent 2.4.1
spring-boot-starter-data-jpa
postgres 12.5
实体的简短摘录:
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Entity
public class Branch extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(columnDefinition = "varchar(255) default ''", nullable = false)
private String name;
@Column(columnDefinition = "varchar(255) default ''")
private String segmentFour;
}
实体生成一个 table 像这样:
就是这样:
ads=# \d clients__branch
Table "public.clients__branch"
Column | Type | Collation | Nullable | Default
-----------------------+------------------------+-----------+----------+----------------------------------
id | integer | | not null | generated by default as identity
name | character varying(255) | | not null | ''::character varying
segment_four | character varying(255) | | | ''::character varying
我们可以看到:
- "name" 不为 null 且具有默认值 ''。
- "segment_one"有默认值,但没有not null约束。
让我们尝试使用它。
让我们填写数据并保存:
Branch branch0 = new Branch();
branch0.setName("Train");
branch0.setSegmentFour("");
Branch branch1 = new Branch();
branch1.setName("Car");
branch1.setSegmentFour(null);
Branch branch2 = new Branch();
branch2.setName("Ship");
结果:
ads=# select id, name, case when segment_four is null then 'null' when segment_four = '' then 'space' end as segment from clients__branch;
id | name | segment
----+---------+---------
1 | Vosst | space
2 | Ryba | null
3 | Admiral | null
问题
我想阻止任何人设置 Null,以防万一 分支 1.
如果我这样组织:
@Column(columnDefinition = "varchar(255) default ''", nullable = false) private String segmentFour;
然后我得到:
ERROR: null value in column "segment_four" violates not-null constraint
我想要一个默认值(branch2 的代码应该 在 segment_four).
中生成 ''
你能帮帮我吗?
我认为没有直接的方法可以使用 @Column 注释来处理这个问题,但是您可以在 setter 方法中拥有自己的逻辑,如果值为 null
public void setSegmentFour(String segmentFour) {
this.segmentFour = segmentFour == null ? "" : segmentFour;
}
我建议您按以下方式将 @ColumnDefault
与 @DynamicInsert
一起使用:
@Entity
@DynamicInsert
public class Branch extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column
@ColumnDefault("''")
private String name;
@Column
@ColumnDefault("''")
private String segmentFour;
// ...
}
然后如果您想使用默认值,只需省略为该字段设置值。
上面的实体使用 @DynamicInsert
注释进行注释,因此 INSERT
语句不包含任何不包含值的实体属性。
请参阅 documentation 中的附加说明。