默认值和非空约束

mwecs4sa  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(424)

spring boot starter父级2.4.1
Spring启动机数据jpa
博士后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

我们可以看到:
“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,就像branch1一样。
如果我这样组织:
@列(columndefinition=“varchar(255)default“”,nullable=false)私有字符串segmentfour;
然后我得到:

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

我想要一个默认值(branch2的代码应该在第四段中生成“”。
你能帮我吗?

piwo6bdm

piwo6bdm1#

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

public void setSegmentFour(String segmentFour) {
 this.segmentFour = segmentFour == null ? "" : segmentFour;
 }
czfnxgou

czfnxgou2#

我建议你用 @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 语句不包含任何不包含值的实体属性。
请参阅文档中的其他说明。

相关问题