Я использую Spring + JPA в качестве рамки orm. Моя структура слоя проекта похожа на веб -> Сервис -> Домен DAO -> genericDAO. В genericDAO я инъецирую EntityManager, используя @PersistenceContext.javax.persistence.EntityNotFoundException: удаленный объект передан для сохранения
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: удаленный объект, переданный для сохранения: [core.entity.OrderItem #].
Я не понимаю, если элемент заказа уже отмечен как удаленный в диспетчере объектов, почему он пытается сохранить.
Когда я раскомментирую строку Y, которая внутренне скрывает диспетчер объектов, он работает нормально. Я не понимаю, почему он требует менеджера сущностей должны быть промыт перед выполнением строки X
Поскольку диспетчер объектов является общим, удаление элемента заказа и загрузка продукта происходит в том же entityManager. Тогда почему ошибка? – javafan