这个问题源自我在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)
// ...
}
}
这些选项是否记录为优于其他选项?
答案 0 :(得分:9)
我倾向于选择ID,因为您有时希望使用悲观锁定,然后很容易将Order.get(orderId)
更改为Order.lock(orderId)
。锁定必须在事务中发生,因此使用您在读取后锁定的第一种方法,在中间运行较小的更新风险。
有时需要在服务之外加载实例,例如测试控制器中是否存在,所以第二种方法可以感觉它浪费了数据库调用。但是您可以将get()
调用更改为exists()
调用并仅检查是否存在id,而不是仅仅为了查看它是否存在而加载整个实例。
请注意,您应该在方法签名中使用long orderId
,因为允许null id没有意义。