运行应用程序的 Grails 2.4 和 hibernate4 错误
Posted
技术标签:
【中文标题】运行应用程序的 Grails 2.4 和 hibernate4 错误【英文标题】:Grails 2.4 and hibernate4 errors with run-app 【发布时间】:2014-07-14 13:37:48 【问题描述】:我已将应用程序升级到 Grails 2.4.0,并且正在使用 hibernate4 插件。执行 run-app 时,使用内存数据库为每个域类生成以下错误示例。我已经阅读了休眠论坛上的几篇帖子,这些错误并不严重。它只是记录一个错误,因为它试图删除的表还不存在。
2014-Mai-24 13:25:26,788 错误 [localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 425 - HHH000389:不成功:更改表 user_role 删除约束 FK_apcc8lxk2xnug8377fatvbn04 如果存在
2014-Mai-24 13:25:26,789 错误 [localhost-startStop-1] org.hibernate.tool.hbm2ddl.SchemaExport - SchemaExport.java 426 - 未找到表“USER_ROLE”; SQL 语句: 如果存在,则更改表 user_role 删除约束 FK_apcc8lxk2xnug8377fatvbn04 [42102-173]
有人知道如何停止记录噪音吗?
【问题讨论】:
你在使用spring security插件吗? 【参考方案1】:这是一个错误,看来你可以这样离开它不会造成任何问题,但如果你不想看到这里的消息,这里有一些解决方案:(编辑:选项 2 似乎工作得更好(见 cmets在这篇文章中))
1.- 来自 DataSource.groovy 的 singleSession 配置
https://jira.grails.org/browse/GRAILS-11198
2.- 覆盖 H2 方言:
public class ImprovedH2Dialect extends H2Dialect
@Override
public String getDropSequenceString(String sequenceName)
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
@Override
public boolean dropConstraints()
// We don't need to drop constraints before dropping tables, that just
// leads to error messages about missing tables when we don't have a
// schema in the database
return false;
Unsuccessful: alter table XXX drop constraint YYY in Hibernate/JPA/HSQLDB standalone
【讨论】:
非常好!我用了#2。我从 Hibernate3 升级到了 Hibernate4(使用 grails 2.3.11,但我认为这并不重要并开始收到这些消息。很烦人。所以,很高兴找到这个问答。 选项 2 效果很好。只需将dataSource.dialect = com.mypackage.ImprovedH2Dialect
添加到您的 DataSource.groovy
只是为了澄清@10GritSandpaper 的评论-我在DataSource.groovy
中添加了dialect = "com.myPackage.ImprovedH2Dialect"
作为dataSource
的属性-谢谢!
@andymccullough ,我实际上想出了一个更简单的解决方案。【参考方案2】:
上面提供的@Luis 解决方案也适用于 mysql。只需扩展 MySQL5InnoDBDialect,如下所示:
import org.hibernate.dialect.MySQL5InnoDBDialect;
public class ImprovedMySQLDialect extends MySQL5InnoDBDialect
@Override
public String getDropSequenceString(String sequenceName)
// Adding the "if exists" clause to avoid warnings
return "drop sequence if exists " + sequenceName;
@Override
public boolean dropConstraints()
// We don't need to drop constraints before dropping tables, that just leads to error
// messages about missing tables when we don't have a schema in the database
return false;
然后在您的数据源文件中更改以下行:
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
到
dialect = my.package.name.ImprovedMySQLDialect
【讨论】:
【参考方案3】:只需设置dbCreate="update"
,错误就会立即消失。
问题是 GORM (hibernate) 试图删除 H2 DB 中从未创建的表,因为每次运行应用程序时都会创建新的 DB。不幸的是,dbCreate 默认设置为 create-drop,这对于在运行时动态创建的数据库确实没有意义。
development
dataSource
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
【讨论】:
为什么不把“create-drop”改为“create” @borjab 我不使用create
,因为create
会破坏之前的数据。在开发过程中,我使用BootStrap.groovy
加载测试数据。当我在服务器运行时更改域对象时,GORM 会在类重新编译和重新加载后刷新模式。这将删除我使用引导程序加载的所有测试数据。所以我最终不得不重新启动应用程序,这会减慢我的速度并扼杀我的流程。以上是关于运行应用程序的 Grails 2.4 和 hibernate4 错误的主要内容,如果未能解决你的问题,请参考以下文章
添加 Spring Security 插件 3.1.1 后,Grails 3.2.4 应用程序不会加载
带有俄语语言的 Grails 2.4 中的 UTF-8 问题