【问题标题】:Translate constraint Check either column not null in spring jpa翻译约束在spring jpa中检查任一列不为空
【发布时间】:2019-12-30 01:16:27
【问题描述】:

我有以下带有 CONSTRAINT CHECK 的 sql 表。我如何在 spring jpa 中翻译这个?

CREATE TABLE IF NOT EXISTS `myschema`.`product` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `barcode` VARCHAR(10) NULL DEFAULT NULL,
  `vrcode` VARCHAR(10) NULL DEFAULT NULL,
  `name` VARCHAR(50) NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `barcode_UNIQUE` (`barcode` ASC),
  UNIQUE INDEX `vrcode_UNIQUE` (`vrcode` ASC),
  CONSTRAINT CHECK (barcode IS NOT NULL OR vrcode IS NOT NULL))
  ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARACTER SET = latin1;

我想要列条形码或 vrcode 中的任何一个不能为空。

@Data
@RequiredArgsConstructor
@Entity
@Table(name = "product")
public class Product implements Serializable {

    private static final long serialVersionUID = -1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "barcode")
    private String barcode;

    @Column(name = "vrcode")
    private String vrcode;

    @Column(name = "name")
    private String name;
}

【问题讨论】:

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


    【解决方案1】:

    你必须像这样对实体本身添加检查

    @Data
    @RequiredArgsConstructor
    @Entity
    @Table(name = "product")
    @Check(constraints = "barcode IS NOT NULL OR vrcode IS NOT NULL") 
    public class Product implements Serializable {
    ...
    

    注意:@RequiredArgsConstructor 已经提供了注解@Data

    【讨论】:

    • 如果我们对不同的列(在sql中)进行多次检查,该怎么办。例如:CONSTRAINT CHECK (barcode IS NOT NULL OR vrcode IS NOT NULL)CONSTRAINT CHECK (name IS NULL AND NOT ( vrcode IS NULL AND barcode IS NULL) )
    • 您不能添加多个@Check,因此您必须使用 () 和 AND 运算符添加所有约束。例如(constraint1)AND(constraint2)AND(constraint3),一个约束代表sql中的1个CONSTRAINT CHECK。如果您有太多约束,我建议您查看 Java Bean Validation,您可以在其中定义自定义注释以对对象进行复杂检查。
    猜你喜欢
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 2017-08-06
    • 2017-03-03
    • 2014-11-23
    • 2018-01-04
    相关资源
    最近更新 更多