启动 grails 应用程序时模式导出错误

Schema Export Errors while launching grails application

我正在尝试学习 Grails 2 - 快速入门指南一书中的 Grails 应用程序。我正在使用的 grails 版本是 Ubuntu 14.04 上的 2.4.4,打开 jdk 7

我收到以下错误

 Error 2015-03-09 20:05:02,117 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - HHH000389: Unsuccessful: alter table tek_event drop constraint FK_1xbf5b7edlnmgmrc90jhbyvg7 if exists
| Error 2015-03-09 20:05:02,118 [localhost-startStop-1] ERROR hbm2ddl.SchemaExport  - Table "TEK_EVENT" not found; SQL statement:

我的应用程序中除了两个域 classes 和脚手架控制器外什么都没有...

这是域 classes TekUser 和 TekEvent

class TekEvent {

    String city
    String name
    TekUser organizingUser
    String venue
    Date startDate
    Date endDate
    String description

    String toString(){
        "$name, $city"
    }

    static constraints = {      
        name()
        city()
        description maxSize:5000
        organizingUser()
        venue()
        startDate ()
        endDate()               
    }
}

以及 TekUser 域 class

    class TekUser {


    String fullName
    String userName
    String password
    String email
    String website
    String bio

    String toString(){
        fullName
    }

    static constraints = {    
        fullName()
        userName()
        email()
        website()
        bio maxSize:5000
    }
}

他们的控制器非常准系统

class TekEventController {
    def scaffold = TekEvent;
}

class TekUserController {
    def scaffold = TekUser;
}

我无法了解这里出了什么问题...或者这是一个我可以忽略的良性错误。

当我将 TekEvent class 中 organizingUser 的数据类型从 String 更改为 TekUser

时,这也开始发生

这些是可忽略的错误 - 没有发生任何不良情况。不幸的是,Hibernate 开发人员更改了 Hibernate 4 中的日志记录策略,这就是您所看到的。

在 Hibernate 3 中,使用 "create-drop" 意味着删除所有当前映射表和关联对象(序列、连接等),然后 运行 创建语句,如果 jvm 关闭干净地,最后再次删除所有表。 "create" 略有不同,因为它执行所有删除和所有创建,但在关闭时不执行任何操作。这是我经常使用的一个,因为它可以让我在应用程序关闭后查看基于磁盘的数据库中的数据。

所以核心问题是初始的 drop 语句缺少 "if exists" 子句,有时 Hibernate 试图删除的并不是所有的东西都存在。所以你会得到这些看起来很可怕的错误,但它们是无害的,因为它们只是告诉你一些应该删除的东西从未创建过。

在 Hibernate 3 中,这些错误存储在字符串列表中,您可以在 运行 执行脚本后访问这些字符串。在 Hibernate 4 中,他们将其更改为记录错误,我假设因为并非该阶段的所有错误都是可以忽略的,所以最好在真正的问题中包含误报,而不是隐藏在可能很少检查的列表中的所有内容。

您可以选择忽略这些(冒着忽略不相关的实际错误消息的风险),或使用生成正确 SQL 的自定义方言。一个例子是 here