3

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

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

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 类还是像服务这样的外部位置?
  3. 我应该使用 withTransaction 还是 withNewTransaction?
  4. 我可以在模型功能中进行交易吗?
  5. addToChildren 应该是调用服务函数来修改模型属性的模型函数吗?
4

1 回答 1

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()
      }
   }
}

由于您正在删除一条记录,因此您需要一个新的休眠会话来处理其他插入。

于 2013-10-30T00:29:31.103 回答