【问题标题】:Schema Export Errors while launching grails application启动 grails 应用程序时出现架构导出错误
【发布时间】:2015-05-11 09:47:21
【问题描述】:

我正在尝试遵循 Grails 2 - A Quick start guide 一书中的 Grails 应用程序。我使用的 grails 版本是 Ubuntu 14.04 上的 2.4.4 和 open 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:

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

这里是域类 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 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 类中organizingUser 的数据类型从String 更改为TekUser 时,这也开始发生了

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    这些都是可以忽略的错误 - 没有什么不好的事情发生。不幸的是,Hibernate 开发人员更改了 Hibernate 4 中的日志记录策略,这就是您所看到的。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2018-03-26
      • 2017-05-07
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多