我尝试使用以下域类在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()
可以正常工作。我已经检查了我能想到的一切。我的域对象是附加的,它们是有效的,它们检测到它们在更改时会变脏。任何人都可以帮我弄清楚这个谜吗?
答案 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')
}