如何在 JPA @Column columnDefinition 中包含 CHECK?

How to include CHECK in JPA @Column columnDefinition?

当我想添加 CHECK.

时,我正在尝试找出 Column 注释中 columnDefinition 的语法

到目前为止我已经尝试过:

@Id
@Column(columnDefinition = "CHAR(1) DEFAULT 'X' ADD CHECK 'X'")
private char Id;

@Id
@Column(columnDefinition = "CHAR(1) DEFAULT 'X', CHECK 'X'")
private char Id;

@Id
@Column(columnDefinition = "CHAR(1) DEFAULT 'X', CHECK (Id = 'X')")
private char Id;

使用 JPA 2.2 (JavaEE 8) 和 openjpa 作为 jpa 提供程序。

无法在文档中找到任何内容:https://javaee.github.io/javaee-spec/javadocs/javax/persistence/Column.html

我得到的错误:

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: 42X01 : [0] Encountered "\'X\'" at line 1, column 52 {stmn
t 1524146915 CREATE TABLE Parish (Id CHAR(1) DEFAULT 'X', CHECK 'X' NOT NULL, church SMALLINT, email VARCHAR(255), name 
VARCHAR(255), officialName VARCHAR(255), phone VARCHAR(255), shortName VARCHAR(255), PRIMARY KEY (Id))} [code=30000, sta
te=42X01]

我可以清楚地看到 Id CHAR(1) DEFAULT 'X', CHECK 'X' NOT NULL,... 是无效的 SQL 语法,但我不知道如何在使用 JPA 时包含 CHECK。在此先感谢您的帮助。

是否可以在列定义中包含 CHECK 约束?

Javax 验证 API 可能会有所帮助。基于注释和验证器,您可以应用和检查列级约束。

像这样:-

@Id
@NotNull
@Column(columnDefinition = "CHAR(1) DEFAULT 'X'")
private char Id;

参考:https://www.baeldung.com/javax-validation

例如参见this

The SQL fragment that is used when generating the DDL for the column.

创建 table 时使用的是 SQL,因此也可能是依赖于数据库的东西。该片段附加到默认列定义。

所以问题不在于 JPA 用法,而在于 SQL 语法。

您非常接近正确的语法,但您应该想想实际的检查是什么。例如,这应该有效(至少对于 Postgres):

@Column(columnDefinition = "CHAR(1) DEFAULT 'X' CHECK (Id = 'X')")
private char Id;

但是示例 CHECK 当然是不健全的,因为它只允许插入 'X' 作为 foo。但是我无法提供完整的答案,因为我不清楚你的 CHECK('X')。也许您想使列不可为空?喜欢:

@Column(columnDefinition = "CHAR(1) DEFAULT 'X' NOT NULL")

甚至更好:

@Column(columnDefinition = "CHAR(1) DEFAULT 'X'", nullable = false)