如何在 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;
例如参见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)
当我想添加 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;
例如参见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)