Jos*_*.OC 6 postgresql jpa unique-constraint
我需要在PostgreSQL中使用这些独特的约束
CREATE UNIQUE INDEX favorites_3col_uni_idx
ON favorites (user_id, menu_id, recipe_id)
WHERE menu_id IS NOT NULL;
CREATE UNIQUE INDEX favorites_2col_uni_idx
ON favorites (user_id, recipe_id)
WHERE menu_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
我在JPA中注释的第一个:
@Table(uniqueConstraints= {
@UniqueConstraint(name="favorites_3col_uni_idx", columnNames = {"user_id", "menu_id", "recipe_id"})
})
Run Code Online (Sandbox Code Playgroud)
但是,有可能在JPA中注释第二个唯一索引吗?
谢谢.
您似乎想要创建部分索引CREATE INDEX ... ON ... WHERE使用 JPA 约束定义( )。
这些是特定于 PostgreSQL 的,并且不是由 JPA 指定的。您将需要使用本机语法来创建它们。我不相信 JPA 为索引定义提供任何功能。
您不能为此目的使用唯一约束,因为唯一部分索引不是唯一约束。无法创建部分唯一索引CONSTRAINT constraint_name UNIQUE(columns)在 PostgreSQL 中。PostgreSQL 为唯一约束创建唯一索引只是一个实现细节。
看:
某些 JPA 提供程序提供特定于该 JPA 提供程序的扩展注释,这些注释添加了用于运行本机 DDL 脚本、使用注释定义索引等的功能。由于您没有提到您使用的是哪个 JPA 提供程序,我无法告诉您更多信息。这是EclipseLink 索引 DDL的文档;这将 无法 正常工作,如果你正在使用Hibernate,OpenJPA的,或者比其他的EclipseLink的东西。
JPA 标准解决方法是在启动期间通过查询pg_catalog.pg_index. 如果找不到它们,请使用 EntityManager 本机查询发送适当的本机 SQLCREATE UNIQUE INDEX命令。一@Startup @Singleton豆是这种,如果你正在使用EJB3.1的任务非常有用。请参阅 PostgreSQL 文档了解pg_catalog.pg_index. 要检查给定名称的索引是否存在,请运行:
SELECT EXISTS(
SELECT 1
FROM pg_index
WHERE indexrelid = 'public.indexname'::regclass
);
Run Code Online (Sandbox Code Playgroud)
请注意,上面的查询没有做任何事情来验证它是您期望的索引,但是您可以通过一些额外的检查来做到这一点。只需pg_index在创建索引后检查内容,即可知道要测试什么。我不建议尝试检查 的任何特定值indpred;只要确保它不为空。
| 归档时间: |
|
| 查看次数: |
3701 次 |
| 最近记录: |