【问题标题】:Default values and not null constraints默认值和非空约束
【发布时间】:2021-04-26 02:00:47
【问题描述】:

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
 

我们可以看到:

  1. "name" 不为 null,并且具有默认值 ''。
  2. “segment_one”有默认值,但没有非空约束。

让我们尝试使用它。

让我们填充数据并保存:

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

问题

  1. 我想阻止任何人设置 Null 以防万一 分支1。

  2. 如果我这样组织:

    @Column(columnDefinition = "varchar(255) default ''", nullable = false) 私有字符串 segmentFour;

    然后我得到:

    ERROR: null value in column "segment_four" violates not-null constraint
    
  3. 我想要一个默认值(branch2 的代码应该 在 segment_four 中生成 '')。

你能帮帮我吗?

【问题讨论】:

    标签: spring spring-boot hibernate spring-data-jpa spring-data


    【解决方案1】:

    我建议您通过以下方式使用@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 中的其他说明。

    【讨论】:

      【解决方案2】:

      我认为没有直接的方法可以使用 @Column 注释来处理这个问题,但是您可以在 setter 方法中拥有自己的逻辑,以便在 value 为 null 时使其为空

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

      【讨论】:

      • 太复杂了。它将在这里带来大量代码。现在我使用 lombok 的 getter,setter。
      • 我猜这只是多出一行,即使 lombok 在没有该条件的情况下创建相同的代码@Kifsif
      • 这只是一个例子。我将不得不在实际项目中重构大量代码。对于每个领域。
      • 也许lombok setter可以有一个默认值?
      猜你喜欢
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多