当前位置: 首页 > 知识库问答 >
问题:

默认值和not null约束

钱锐
2023-03-14

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;
}

该实体生成一个表,如下所示:

就是这样:

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
 

我们可以看到:

    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,就像在branch1中那样。

    如果我这样组织它:

    @columnDefinition=“varchar(255)default''”,nullable=false)私有字符串segmentfour;

    然后我得到:

    ERROR: null value in column "segment_four" violates not-null constraint
    

    我希望有一个默认值(branch2的代码应该在segment_four中生成'')。

    你能帮我吗?

  • 共有1个答案

    羊舌炯
    2023-03-14

    我认为使用@column注释没有直接的方法来处理这个问题,但是您可以在setter方法中拥有逻辑,如果value为null,则将其设置为空

    public void setSegmentFour(String segmentFour) {
     this.segmentFour = segmentFour == null ? "" : segmentFour;
     }
    
     类似资料:
    • 我对Liquibase有点陌生。我遇到了一个场景,在一个中,它试图首先添加默认值,而不是旁边的空约束。 但这里的问题是两者都

    • 注:内容翻译自官网文档 Language Guide (proto3) 中的 Default Values 一节 当消息被解析时, 如果被编码的消息没有包含特定的简单元素, 被解析的对象对应的字段被设置为默认值. 默认值是和类型有关的: 对于strings, 默认值是空字符串(注, 是"", 而不是null) 对于bytes, 默认值是空字节(注, 应该是byte[0], 注意这里也不是null)

    • 主要内容:在创建表时设置默认值约束,在修改表时添加默认值约束,删除默认值约束默认值(Default)的完整称呼是“默认值约束(Default Constraint)”,用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。 例如,员工信息表中,部门位置在北京的较多,那么部门位置就可以默认为“北京”,系统就会自动为这个字段赋值为“北京”。 默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。 在

    • 我正在开发一个JPA应用程序,并且我正在使用eclipse链接提供程序。 我有一个表T1,其中有一个字段F1定义为非null,并且有一个默认值(“U”)。 我已经定义了一个映射到表T1的实体。该实体有一个映射到字段F1的属性,我已经用注释@ReturnInsert(returnOnly=true)配置了该属性。 文件说明: 使用@返回插入使INSERT操作将值返回到正在写入的对象中 如果在映射到F

    • hibernate有没有一种方法可以为每个字段定义默认值,并且为了数据库大小的缘故,可以写null而不是这些默认值? 对于inst,假设字符串的默认值为“”。我想Hibernate到: 为数据库中具有NULL的每个字段返回". 写NULL到数据库,当我尝试写" 当然,我可以写成千上万个Getters和Setters,但是它能自动完成吗?

    • Parameter Position Type Required Default Description 1 string No empty This is the default value to output if the variable is empty. 这是变量为空的时候的默认输出。 This is used to set a default value for a variable.