【问题标题】:Grails/Hibernate: Field "version" doesn't have a default valueGrails/Hibernate:字段“版本”没有默认值
【发布时间】:2016-03-22 09:36:45
【问题描述】:

我在我的项目中添加了一个新的域类,当调用该方法向表中添加一个新实例时,抛出一个奇怪的错误。


这是调用:(如果不是简单的保存和打印错误)

if (!distributor.save()) {
    flash.error = message(code: 'unexpectedError')
    distributor.errors.each {
        println it  
    }
}

这是堆栈跟踪:(仅由部分引起)

Caused by: java.sql.SQLException: Field 'version' doesn't have a default value

有人遇到这个错误吗?我不明白为什么会这样,因为version 是 Grails/Hibernate 框架自动生成的字段。

我尝试删除表并重新创建它,但仍然遇到相同的错误。 这可能是一个错误吗?我不认为我做错了,因为这不是我在项目中的第一个表或关系。

任何帮助将不胜感激。

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    如果您不需要版本,请使用

    static mapping = {
            version false
    }
    

    如果你确实需要,请尝试

    static mapping = {
            version true
    }
    

    你可以像这样设置一个默认值

    static mapping = {
            PROPERTY_NAME defaultValue: DESIRED_VALUE
    }
    

    【讨论】:

    • 字段版本,由hibernate创建和使用,以处理该行是否被另一个事务更新或删除。在我所有的其他表(域类)中,我不处理版本的任何内容,并且始终运行良好。 我想知道为什么现在会抛出错误。因为不建议程序员修改该字段,所以 Grails/Hibernate 负责。
    • 如果您使用迁移,您将了解谁在何时创建了什么内容,并且您会看到版本是突然创建的还是由 gorm 创建的。我遇到过。整体版本会影响您的乐观锁定机制,但它仍然可以工作,但存在一些性能缺陷。
    • 感谢您的回答。我终于得出结论,如果你想修改域类或它们之间的关系,请先停止应用程序,不要花时间尝试修复应用程序重新编译引起的莫名其妙的错误
    • @IgniteCoders 现在在 2019 年,我似乎遇到了这个问题。重新编译后它可以有效地工作。重新启动应用程序会产生合理的结果。它仍然是 Grails/Hibernate 错误吗?
    • 据我所知,仍然是一个 Grails/Hibernate 错误
    【解决方案2】:

    我找到了一个不是最有效但解决了我的问题的解决方案。

    这看起来像一个 Grails/Hibernate 错误,有时会在您添加域类或在项目已经运行时修改它或它们的关系时发生。


    在这个question 中,他们询问了同样的错误,但使用了id 字段。我试过这个solution 并工作:

    1. 放下有问题的桌子。
    2. 备份数据库。
    3. 删除数据库
    4. 从备份重新创建数据库
    5. 运行项目以创建有问题的表

    如果您已经有备份,则不需要第 1 步和第 2 步。


    这个解决方案的问题是如果你的数据库很大的话。主要需要大约 20-30 分钟来进行备份或从备份中重新创建数据库。

    【讨论】:

    • 今天我遇到了和你一样的问题。它只发生在 sping junit 测试中,而不是在项目中。奇数
    • 能否不停止项目,运行 clean 或 clean-all 并重新启动 using run-app?
    猜你喜欢
    • 2014-02-10
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多