Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
域类函数与服务函数[Grails]_Grails_Spring Mvc_Gorm_Grails 2.0_Grails Domain Class - Fatal编程技术网

域类函数与服务函数[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()
    }
}
  • 可以在域模型中使用这样的事务吗
  • addToChildren函数应该放在哪里?它是在用户类、学校类还是像服务一样的外部场所
  • 我应该使用withTransaction还是withNewTransaction
  • 我可以在模型函数中进行事务处理吗
  • addToChildren应该是一个调用服务函数来修改模型属性的模型函数吗

  • 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我认为你的问题的答案比我们上面的答案更清楚、更中肯。相关问题不应该是新问题,这样你/他人挖掘的区域就不会隐藏在评论中了吗?