域类功能与服务功能[Grails]

con*_*ile 3 grails spring-mvc grails-orm grails-domain-class grails-2.0

我需要在一个事务中保存和更新不同域类的属性.

我知道我可以使用以下内容:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 是否可以在域模型中使用这样的事务?
  2. 我应该在哪里放置addToChildren函数?它是在User类,School类还是像服务这样的外部位置?
  3. 我应该使用withTransaction还是withNewTransaction?
  4. 我可以在模型功能中进行交易吗?
  5. addToChildren应该是一个模型函数,它调用服务函数来修改模型属性吗?

Sér*_*els 10

Grails服务已经是事务性的,它是操作域类的最佳位置.该文件解释它:

服务通常涉及域类之间的协调逻辑,因此通常涉及跨越大型操作的持久性.鉴于服务的性质,它们经常需要交易行为.您可以使用带有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()
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

由于您要删除记录,因此需要一个新的hibernate会话来处理其他插入.

  • @confile我认为你的问题的答案不能比我们上面提到的更清晰,更明确.不应该将相关问题作为新问题,以便您/他人挖掘的区域不会隐藏在评论中吗? (2认同)