【问题标题】:Grails: Difference between Author.withTransaction{} and Book.withTransaction{} if both Author and Book should be saved in that transactionGrails:如果 Author 和 Book 都应保存在该事务中,则 Author.withTransaction{} 和 Book.withTransaction{} 之间的区别
【发布时间】:2019-09-20 19:24:09
【问题描述】:

Grails 3.2.9 版

Grails documentation for withTransaction 并没有说明使用 Author.withTransactionBook.withTransaction 之间的区别,以防我想同时保存 AuthorBook 域实例交易如下:

Author author = Author.get(1)
Book book = Book.findByAuthor(author)

Author.withTransaction { // what if we use Book here instead of Author
    author.age = 39
    book.price = 45

    author.save(failOnError: true)
    book.save(failOnError: true)
}

没有找到任何其他说明差异的文档。

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    没有区别,他们都做同样的事情。每个域类都用withTransaction 装饰,这是相同的跨国代码。你可以使用Foo.withTransaction,甚至不做任何与Foo相关的事情,这没关系。

    【讨论】:

    • 所以语法有点奇怪,实际上在哪个域上调用withTransactional() 方法并不重要。顺便说一句,这个事实是否在文档中的某处提到没有任何区别,或者我们应该猜到? :)
    • @SurenAznauryan 数据库事务与实体无关。事务与连接相关联。您可以在事务中与任意数量的实体/表/行进行交互。
    • “所以语法有点奇怪,实际上你在哪个域上调用 withTransactional() 方法并不重要。” - 我认为这与语法无关。无论您在哪个域类上调用该方法,语法都是完全相同的。
    • 语法是<Some Domain Class>.withTransaction(<someClosure>)
    • “首先想到该方法应该有一个特定于该类的逻辑” - 不是。 “否则为什么它在那个类上可用” - 因为我们需要把方法放在某个地方。我们本可以在某个名为TransactionHelper 或其他名称的类上将其设为静态方法,但我们没有。如果存在域类,您只会调用withTransaction,因此我们所做的就是将其挂在那里。本来可以做不同的,但事实并非如此。
    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2021-07-15
    相关资源
    最近更新 更多