我将使用Invoice和invoiceLineItems的标准示例。所以我有一个发票的单一存储库,因为发票是聚合根。创建整个发票并删除发票非常简单。如何更新发票?
也许我不应该这么认为“低水平”,但我无法想象一个很好的方法来处理这个问题。这是我的这个操作的伪代码
public void Update(Invoice inv)
{
var dbVersion = GetInvoice(id);
foreach(var lineItem in inv.LineItems)
{
if (lineItem not in dbVersion)
{
InsertLineItem(lineItem);
}
else
{
UpdateLineItem(lineItem);
}
}
foreach(var lineItem in dbVersion)
{
if (lineItem not in inv)
{
DeleteLineItem(lineItem);
}
}
}
我正在想象这个东西需要产生的查询,而且看起来非常低效。
当然,您不必为整个发票和InvoiceLineItem生成更新语句,但这需要您检查每个中的所有属性。
如果您使用了IvoiceLineItemRepo,则只有在用户执行需要更新的操作时才会更新。因此,如果用户只更新了一行,那么只有一个更新和该订单项,您不必检查更改,您可以假设它已更改。
有更好的方法来处理更新吗?
答案 0 :(得分:0)
你可以先删除LineItem集合,然后在hibernate中插入像all-delete-orphan这样的新集合。
deleteAllLineItemsByInvoiceId(Long id);
insertAllLineItems(List<LineItem> lineItems);