Grails 2.0中的dateCreated,lastUpdated字段

时间:2012-01-29 09:52:44

标签: grails gorm grails-domain-class grails-2.0

我有一个使用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

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

Grails 2.0中是否已弃用dateCreatedlastUpdated字段?如果是这样,这是否意味着我必须编写代码来手动处理此功能或将代码移动到某种类型的插件,如audit-trail插件?

4 个答案:

答案 0 :(得分:17)

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

static mapping = {
        autoTimestamp true
}

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

答案 1 :(得分:6)

Grails 2.0仍然支持自动时间戳。 It's listed in the manual (scroll up a bit from this link)

然而,它特别提到:

  

如果您对nullable: falsedateCreated加上lastUpdated限制,您的域实例将无法通过验证 - 可能不是您想要的。除非您已禁用自动时间戳,否则请将约束保留在这些属性之外。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

with
  cte(id,parent_id,sort_column) as
    (
      VALUES 
        (1, null, 'y' ),
        (2, 1   , 'z' ),
        (3, null, 'u' ),
        (4, null, 'q' ),
        (5, 4   , 'o' ),
        (6, 4   , 'p' ),
        (7, null, 'c' )
    ),
  cte_branch as
  (
     SELECT coalesce(parent.id, cte.id) as branch_id, cte.id, cte.parent_id, cte.sort_column, 
            row_number over (partition by coalesce(parent.id, cte.id) order by cte.sort_column) as rn
     FROM cte
     left join cte parent on cte.parent_id = parent.id
  )
select * from cte_branch
order by rn, id nulls first 

参考

AutoTimestampEventListener