使用Hibernate启用或禁用外键的索引

时间:2016-05-02 19:12:50

标签: mysql database hibernate postgresql jpa

我有一个简单的数据库模式,其中有两个表A和B,它们已经使用Hibernate建模为实体。 B中的每一行都有一个唯一标识A行的外键。

我注意到如果我使用Postgres作为数据库,默认情况下不会为外键创建索引。由于我有很多行和一些删除级联配置,我决定配置我的Hibernate实体使用JPA @Index注释。它运作良好,我可以看到索引已创建。

但是,由于某些原因,我不得不切换到另一个数据库后端:HSQLDB。我们考虑了用于创建索引的JPA注释,但由于HSQLDB默认创建了所有外键的索引,因此我最终为同一列创建了2个索引。

我已经读过,外键索引的创建是特定于数据库提供程序的(例如,Oracle和Postgres不会创建索引,但MySQL和HSQLDB会这样做。)

我想知道是否有一种方法可以启用/禁用外键的索引创建,无论提供者是什么?否则看起来我必须应对双重索引。

欢迎任何想法,评论,建议。

2 个答案:

答案 0 :(得分:1)

你不能在HSQLDB中更改它...除非你想下载源代码并自己调整它。

来自HSQLDB docs

  

HSQLDB在内部创建索引以支持PRIMARY KEY,UNIQUE和FOREIGN KEY约束:为每个PRIMARY KEY或UNIQUE约束创建唯一索引;为每个FOREIGN KEY约束创建一个普通索引。因此,您不应在这些约束所涵盖的相同列集上创建重复的用户定义索引。

答案 1 :(得分:1)

我处于类似的情况,我们的产品必须支持各种rdbms(firebird,mssql,oracle,db2)。我们只为所有rdbms上的所有外键创建索引。 对于较大的项目,不依赖hibernate hbm2ddl功能进行数据库设置也是一个好主意。像flyway或liquibase这样的解决方案可以更好地控制你的ddl(虽然代价是你必须编写和维护的附加代码)。