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

时间:2013-10-30 00:18:52

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

1 个答案:

答案 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会话来处理其他插入。