Grails需要显式刷新才能实际持续更改

时间:2014-05-27 04:20:39

标签: hibernate grails relational-database gorm

我尝试使用以下域类在Grails中保持一对多的关系。用户应该有许多任务(任务应该有对其用户的引用)。

User.groovy

package helloworld

class User {
    String name
    String password
    Date   register_date

    static hasMany = [tasks: Task]
    static mapping = {
        tasks cascade: "all-delete-orphan"
    } 
    static constraints = {
    }
}   

Task.groovy

package helloworld

class Task {
    String description
    Date due
    Boolean deleteFinished
    Boolean finished

    static belongsTo = [owner: User]
    static constraints = {
    } 
}   

TodoController.groovy(问题?)

...
def persist() {
    User u = User.get(session["user_id"])
    Boolean df = params["deleteFinished"] != null
    Task t = new Task(description: params["description"], due: params["due"], deleteFinished: df, finished: false)
    u.addToTasks(t)
    u.save(flush: true) //problem point
    redirect(action: 'index')
}

...

因此,根据所有文档,我已经阅读过hibernate会话应该在每个请求结束时刷新并关闭,但这似乎不是这里的情况。 u.save(flush: true)可以正常工作,保留所有更改或添加子项(任务t),但是当我使用u.save()时,对您所做的任何更改以及Task t都不会被保留请求结束后。更奇怪的是,如果我使用事务封装方法将代码移动到Grails服务,u.save()可以正常工作。我已经检查了我能想到的一切。我的域对象是附加的,它们是有效的,它们检测到它们在更改时会变脏。任何人都可以帮我弄清楚这个谜吗?

1 个答案:

答案 0 :(得分:-1)

默认情况下,控制器没有启用事务。将代码移动到服务(默认情况下它们是事务性的)或将您的方法注释为事务性应解决您的问题。

import grails.transaction.Transactional

    @Transactional
    def persist() {
        User u = User.get(session["user_id"])
        Boolean df = params["deleteFinished"] != null
        Task t = new Task(description: params["description"], due: params["due"], deleteFinished: df, finished: false)
        u.addToTasks(t)
        u.save()
        redirect(action: 'index')
    }