我有一个使用Grails 1.3.7的应用程序,我刚刚迁移到Grails 2.0。应用程序使用自动dateCreated
和lastUpdated
字段来管理与对象的创建和修改相关联的时间戳。升级后,我收到以下错误:
| 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中是否已弃用dateCreated
和lastUpdated
字段?如果是这样,这是否意味着我必须编写代码来手动处理此功能或将代码移动到某种类型的插件,如audit-trail插件?
答案 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: false
或dateCreated
加上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