我需要在一个事务中保存和更新不同域类的属性。
我知道我可以使用以下内容:
def addToChildren(String name, int age) {
User.withTransaction {
def user = new User(name)
user.age = age
user.save()
def school = new School()
school.addToUsers(user)
school.save()
}
}
答案 0 :(得分:10)
Grails服务已经是事务性的,它是操作域类的最佳位置。 documentation解释了它:
服务通常涉及域之间的协调逻辑 类,因此经常涉及跨越大的持久性 操作。鉴于服务的性质,他们经常需要 交易行为。您可以使用程序化事务 withTransaction方法,但这是重复的,但不是 充分利用Spring的底层交易的力量 抽象。
因此无需在其中使用withTransaction
。
修改强>
我应该在哪里放置addToChildren函数?
这更像是一个设计决策,您可以在域类或服务中声明方法。就个人而言,当我操作多个域类时,我倾向于在服务类中执行此操作,除非我需要使用GORM事件:beforeInsert()
,beforeUpdate()
和beforeDelete()
。
我可以在模型功能中使用交易吗?
是的,您可以在域类中使用事务/休眠会话。一个常见的例子是beforeDelete事件:
class Person {
String name
def beforeDelete() {
ActivityTrace.withNewSession {
new ActivityTrace(eventName: "Person Deleted", data: name).save()
}
}
}
由于您要删除记录,因此需要一个新的hibernate会话来处理其他插入。