13

我有一个使用 Grails 1.3.7 的应用程序,我刚刚迁移到 Grails 2.0。该应用程序利用自动dateCreatedlastUpdated字段来管理与对象的创建和修改相关的时间戳。升级后,我收到以下错误:

| Running Grails application
| Error 2012-01-29 22:36:53,504 [Thread-8] ERROR util.JDBCExceptionReporter  - ERROR: null value in column "date_created" violates not-null constraint
| Error 2012-01-29 22:36:53,510 [Thread-8] ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session

在我的域类中注释掉上述字段会使问题消失。

Grails 2.0 中是否已弃用anddateCreated字段?lastUpdated如果是这样,这是否意味着我必须编写代码来手动处理此功能,或者代码是否已移至某种插件,例如审计跟踪插件?

4

4 回答 4

18

好的,通过在域类定义中手动将 autoTimestamp 变量设置为“true”来修复它:

static mapping = {
        autoTimestamp true
}

我猜这个属性在将项目从 Grails 1.3.7 迁移到 2.0.0 后没有设置。

于 2012-01-30T08:52:09.290 回答
6

Grails 2.0 仍然支持自动时间戳。 它列在手册中(从此链接向上滚动一点

但是,它特别提到:

如果您对或施加nullable: false约束,您的域实例将无法通过验证 - 可能不是您想要的。除非您禁用了自动时间戳,否则请不要限制这些属性。dateCreatedlastUpdated

于 2012-01-29T17:08:24.280 回答
3

Grails 2.0.3 中有一个错误,在使用 Postgres 时可能会导致此问题。请参阅http://jira.grails.org/browse/GRAILS-8988。该问题表示将在 2.0.4 发布时解决。

于 2012-05-04T19:08:55.940 回答
0

如果您在 Grails 4 中工作,我找到了一个替代解决方案:

class ScheduledTaskServiceSpec extends Specification implements ServiceUnitTest<ScheduledTaskService>{

    @Shared @AutoCleanup HibernateDatastore hibernateDatastore
    @Shared AutoTimestampEventListener timestamper

    void setupSpec() {
        hibernateDatastore = new HibernateDatastore(RegistrationCode)
        timestamper = hibernateDatastore.getAutoTimestampEventListener()
    }

    @Transactional
    @Rollback        
    void 'some test method'() {
        when:
        timestamper.withoutDateCreated(MyDomainClass) {
            MyDomainClass mdc = new MyDomainClass(name:"foo")
            mdc.dateCreated = new Date() - 20
        }

        then:
        MyDomainClass.findByName("foo").dateCreated < new Date()
    }
}

参考

自动时间戳事件监听器

于 2019-08-02T18:19:21.773 回答