运行应用程序的 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 问题

Grails 视图编解码器不工作 (2.4)

grails tomcat jndi的最佳mysql数据源属性

Grails 2.3 迁移脚本不会在集成测试期间运行

Grails 2.4 ClassNotFoundException:Sitemesh GrailsPageFilter