【发布时间】:2019-06-18 09:37:19
【问题描述】:
我想在 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 匹配预期结果?
【问题讨论】:
-
我知道的唯一替代方法是在
@Column注释中定义它,如下所示:@Column(columnDefinition = "VARCHAR(60) CHECK (status IN ('ACTIVE', 'PENDING', 'INACTIVE'))) private String status;但我认为您不能为其添加特定名称。