9

这个问题源于我在 Grails 应用程序上的工作,但它适用于几乎所有分层开发的 Web 应用程序。这是一个简单的例子:

class OrderService {

    // Option 1
    def shipOrder(Order order) {
        order.status = OrderStatus.SHIPPED
        emailService.sendShipmentEmail(order)
        // ...
    }

    // Option 2
    def shipOrder(long orderId) {
        def order = Order.get(orderId)
        order.status = OrderStatus.SHIPPED
        emailService.sendShipmentEmail(order)
        // ...
    }

}

这些选项中的任何一个是否被记录为比另一个更好?

4

1 回答 1

9

我倾向于更喜欢 id,因为有时您想使用悲观锁定,然后很容易更改Order.get(orderId)Order.lock(orderId). 锁定必须发生在事务中,因此使用第一种方法你会在阅读后锁定,在两者之间运行更新的风险很小。

有时需要在服务之外加载实例,例如在控制器中测试是否存在,所以第二种方法感觉就像是在浪费数据库调用。但是您可以将get()调用更改为exists()调用并仅检查 id 是否存在,而不是加载整个实例来查看它是否存在。

请注意,您应该long orderId在方法签名中使用,因为允许空 id 没有意义。

于 2013-07-03T18:33:25.053 回答