我有一个包含多个发票项目的发票对象。根据用户选择,我需要将一些物品从一张发票转移到另一张发票。 我正在使用MySql和Hibernate。
发票项目定义为延迟加载,如下所示:
在Java中,我执行以下操作:
Invoice newInvoice = new Invoice();
iter = invoice.getPurchasableItems().iterator();
while(iter.hasNext()){ // item that is not purchased into new invoice
InvoiceItem item = iter.next();
invoice.getItems().remove(item);
newInvoice.addItem(item);
}
然后我保存两张发票:
iter = newInvoice.getItems().iterator();
while(iter.hasNext()){
InvoiceItem item = iter.next();
session.saveOrUpdate(item);
}
iter = invoice.getItems().iterator();
while(iter.hasNext()){
InvoiceItem item = iter.next();
session.saveOrUpdate(item);
}
session.commit();
我得到了ObjectDeletedException。除了将发票项目从一张发票转移到另一张发票之外,我不认为我有任何其他参考发票项目。我这样做是因为我想确保我最终没有为发票项目表提供大量未使用的ID。
你能建议一种解决这个问题的方法吗?
答案 0 :(得分:0)
也许它与您的问题无关,但您的第一次可能正在修改您正在迭代的集合。您应该使用迭代器中的remove()方法。
然后将InvoiceItem从一个包更改为另一个包是不够的,您还需要更新invoiceItem,我不知道您的InvoiceItem中是否有ManyToOne上的ManyToMany,但我认为您必须同时设置它们关系的一面。
Invoice newInvoice = new Invoice();
iter = invoice.getPurchasableItems().iterator();
while(iter.hasNext()){ // item that is not purchased into new invoice
InvoiceItem item = iter.next();
iter.remove();
item.setInvoice(newInvoice);
newInvoice.addItem(item);
}