我使用spring + JPA作爲orm框架。我的項目層結構就像web - > Service - > Domain DAO - > genericDAO。 在genericDAO中,我使用@PersistenceContext注入EntityManager。javax.persistence.EntityNotFoundException:已刪除的實體傳遞給persist
genericDAO.delete(Object o) {
o = entityManager.merge(o);
entityManager.remove(o);
}
genericDAO.saveOrUpdate(Object o) {
entityManager.merge(o);
entityManager.flush();
}
在服務層的一種方法中,我有以下操作。
// delete order item if already exists.
Order order = getOrderFromSession();
if (CollectionUtils.isNotEmpty(orderItems)) {
Iterator<OrderItem> iterator = orderItems.iterator();
while (iterator.hasNext()) {
OrderItem orderItem = iterator.next();
iterator.remove();
orderDAO.deleteOrderItem(orderItem); // Which internall calls genericDAO.delete()
}
}
//orderDAO.saveOrder(order) // line Y
//Now create fresh order items submitted by jsp form.
for (ProductVO productVO : productList) {
if (productVO.getQuantity() > 0) {
orderItem = new OrderItem();
Product product = productDAO.getProductByCode(productVO.getCode()); // line X
orderItem.populateOrderItemByProduct(product, productVO.getQuantity(), order);
order.addOrderItem(orderItem);
}
}
X行使用hql檢索產品實體。但是當X行被執行時,我得到了錯誤。 javax.persistence.EntityNotFoundException:傳遞給persist的已刪除實體:[core.entity.OrderItem#]。
我不明白訂單商品是否已在實體經理中標記爲已刪除,爲什麼它會嘗試持續。
當我取消註釋行Y,它內部刷新實體管理器,它工作正常。我不明白爲什麼它需要實體管理器執行行X
由於實體管理器是共享的,刪除訂單項和加載產品發生在同一個entityManager中。那爲什麼是錯誤? – javafan 2014-09-27 18:36:35