域类函数与服务函数[Grails]
我需要在一个事务中保存和更新不同域类的属性 我知道我可以使用以下方法:域类函数与服务函数[Grails],grails,spring-mvc,gorm,grails-2.0,grails-domain-class,Grails,Spring Mvc,Gorm,Grails 2.0,Grails Domain Class,我需要在一个事务中保存和更新不同域类的属性 我知道我可以使用以下方法: 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)
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()
}
}
Grails服务已经是事务性的,它是操作域类的最佳场所。报告解释说: 服务通常涉及域之间的协调逻辑 类,因此通常涉及跨大型 操作。鉴于服务的性质,他们经常需要 交易行为。您可以将编程事务用于 withTransaction方法,但是这是重复的,不会 充分利用Spring底层事务的强大功能 抽象 因此,不需要在它们内部使用
with transaction
编辑
addToChildren函数应该放在哪里
这更像是一个设计决策,您可以在域类或服务中声明您的方法。就个人而言,当我操作多个域类时,我倾向于在服务类中进行操作,除非我需要使用GORM事件:beforeinstert()
、beforeUpdate()
和beforeDelete()
我可以在模型函数中进行事务处理吗
是的,您可以在域类中使用事务/休眠会话。常见的示例是beforeDelete事件:
class Person {
String name
def beforeDelete() {
ActivityTrace.withNewSession {
new ActivityTrace(eventName: "Person Deleted", data: name).save()
}
}
}
由于您要删除一条记录,您需要一个新的hibernate会话来处理其他插入。好的,这并不能回答我的问题。addToChildren函数应该放在哪里?我可以在模型函数中进行事务处理吗?addToChildren是否应该是一个调用服务函数来修改模型属性的模型函数?何时应该与NewSession一起使用,何时与session一起使用?与session一起使用同一个已打开的会话。假设您要执行一系列操作,最后使用with session刷新。withNewSession将使用一个新的会话。你能给我举个例子说明什么时候建议使用withNewSession()?@confile我认为你的问题的答案比我们上面的答案更清楚、更中肯。相关问题不应该是新问题,这样你/他人挖掘的区域就不会隐藏在评论中了吗?