使用 Hibernate @Index 注解在数据库上创建索引
我的项目具有注释驱动的休眠功能。
现在我想在列上创建索引。我当前的列定义是
@NotNull
@Column(name = "hash")
private String hash;
,我在此处添加 @Index
注释。
@NotNull
@Column(name = "hash")
@Index(name="hashIndex")
private String hash;
然后删除表并重新启动 Tomcat 服务器。服务器实例化后,表被创建,但我在以下查询中看不到新索引。
SHOW INDEX FROM tableName
预计将使用新索引构建表。我正在使用 InnoDB 和 MySQL。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
有趣的是,在我的 Hibernate 配置中,我使用了 hibernate.hbm2ddl.auto=update 。
此操作修改现有数据库。我手动删除表
tableName
并重新启动 Tomcat,表已构建,但未创建索引。但是,我制作了
hibernate.hbm2ddl.auto=create
,它在每次 webapp 实例化时重新创建数据库,它删除了我所有的数据库并重新构建回来 - 是的 - 我的新索引已经创建了!Interestingly, in my Hibernate configuration I was using
hibernate.hbm2ddl.auto=update
.This one modifies an existing database. I was manually DROPping the table
tableName
and restarting Tomcat and the table had been constructed but index was not being created.However, I made
hibernate.hbm2ddl.auto=create
which re-creates database upon each instantiation of webapp, it dropped all my database and rebuilt back and -hell yeah- my new index has been created!在 Hibernate 中有意禁用架构更新时的索引创建,因为它似乎与架构导出中使用的命名不一致。
这是您可以在
org.hibernate.cfg.Configuration
类中找到的注释代码。通常我会删除该注释,重新编译 Hibernate.jar 并在架构更新时创建索引,不会出现任何问题,至少对于 Oracle DB 来说是这样。
在 Hibernate 的最新版本中,官方版本中也删除了第一部分(表索引)的注释,但仍然注释了第二部分(实现唯一键的索引)。
请参阅http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012<的讨论< /a>
Index creation on schema update was intentionally disabled in Hibernate because it seemed inconsistent with the naming used in the schema export.
This is the commented code that you can find in class
org.hibernate.cfg.Configuration
.Usually I remove that comment, recompile Hibernate.jar and have indexes created on schema update without any problem, at least with Oracle DB.
In recent versions of Hibernate the comment on the first part (table indexes) has been removed in the official version as well, while it's still commented the second one (indexes that implement unique keys).
See the discussion at http://opensource.atlassian.com/projects/hibernate/browse/HHH-1012
更好的数据库设计意味着模式由与数据本身不同的用户拥有。因此,我设置了 hibernate.hbm2ddl.auto=none ,这样 Hibernate 启动时就不会出现故障。我改用 SchemaPrinter。其输出可以通过我最喜欢的 SQL 工具运行,以便在需要时重新创建模式。
Better DB design means the schema is owned by a different user than the data itself. Hence I set
hibernate.hbm2ddl.auto=none
so there are no failures upon Hibernate start. I use a SchemaPrinter instead. The output of which can be run via my favorite SQL tool to recreate the schema when required.在 Hibernate 3.5.6 中使用update>索引已创建。所以现在正确的答案是升级。
但我把这个答案留给像我这样遇到过这个问题的人。
In Hibernate 3.5.6 using
<property name="hibernate.hbm2ddl.auto">update</property
> the indexes are created. So a proper answer now would be to upgrade.But I'm leaving this answer for those like me that have come across this question.