gpt4 book ai didi

java - 如何设置类级别jpa检查约束的名称

转载 作者:太空宇宙 更新时间:2023-11-04 09:34:43 25 4
gpt4 key购买 nike

我想在 JPA 中对实体定义一个约束,以确保两个属性“text”或“title”之一设置为非空值。

对于此示例,假设有以下 Question 实体类:

@Entity
@Table
public class Question {

@Id
private Long id;

@Column(nullable = true)
private String text;

@Column(nullable = true)
private String title;

}

对于这个类,JPA将生成以下SQL语句(我们需要使用oracle方言):

    create table question (
id number(19,0) not null,
text varchar2(50 char) null,
title varchar2(10,0) null,
primary key (id)
);


为了检查任一属性是否已设置,我可以添加检查约束:

@Entity
@Table
@Check(constraints = "TEXT IS NOT NULL OR TITLE IS NOT NULL")
public class Question {
...
}

现在 JPA 将生成以下内容:

    create table question (
id number(19,0) not null,
text varchar2(50 char) null,
title varchar2(10,0) null,
primary key (id),
check (TEXT IS NOT NULL OR TITLE IS NOT NULL)
);

在数据库方面,这将生成一个具有随机名称(如“SYS_C00127157”)的检查约束。

为了给约束分配一个有意义的名称(例如:check_title),我可以使用以下 DDL:

    create table question (
id number(19,0) not null,
text varchar2(50 char) null,
title varchar2(10,0) null,
primary key (id),
constraint check_title check(TEXT IS NOT NULL OR TITLE IS NOT NULL)
);

我正在寻找的是这样的:

@Entity
@Table
@Check(name = "check_title" constraints = "TEXT IS NOT NULL OR TITLE IS NOT NULL")
public class Question {
...
}

不幸的是,这是不可能的。 Java 中的 @Check 注释不为约束提供这样的 name 属性。

是否有其他方法来设置名称,以便生成的 DDL 与预期结果匹配?

最佳答案

不幸的是,这是不可能的。如果您看一下表生成脚本是如何构建的:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/mapping/Table.java#L604

您将看到您在 @Check 注释中指定的字符串只是像这样包装:

buf.append( ", check (" )
.append( checkConstraint )
.append( ')' );

并将约束名称的生成赋予数据库。

相比之下,a few lines above ,您可以发现可以影响唯一约束的名称。 Here你可以找到一个例子。

关于java - 如何设置类级别jpa检查约束的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com