【问题标题】:How to include CHECK in JPA @Column columnDefinition?如何在 JPA @Column columnDefinition 中包含 CHECK?
【发布时间】:2021-06-27 19:38:16
【问题描述】:

当我想添加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 约束?

【问题讨论】:

  • 你真的想通过 JPA 定义你的数据库模式吗?对我来说似乎不是一个好的选择。
  • @plalx 为什么这对你来说不是一个好选择?
  • 好吧,定义原生 CREATE TABLE 语句并使用原始 SQL 创建模式必须更简单,其次,如果您必须将原生 SQL 嵌入 JPA 映射中,则它违背了 DB 抽象层的目的。

标签: sql jpa jakarta-ee


【解决方案1】:

例如,请参阅this

为列生成 DDL 时使用的 SQL 片段。

创建表时使用的是 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)

【讨论】:

  • 我想做单行表
  • @Wortig 不确定检查是否是最佳实践,也许您需要一个序列。但在这种情况下,检查 id = 'X' 可能没问题,因为它可以防止插入除 'X' 以外的任何内容作为 id -> 单行。
【解决方案2】:

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

像这样:-

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

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

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2013-04-11
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多