【发布时间】:2014-11-22 11:38:58
【问题描述】:
我使用 spring + JPA 作为 orm 框架。我的项目层结构类似于 web --> Service --> Domain DAO --> genericDAO。 在 genericDAO 中,我使用 @PersistenceContext 注入 EntityManager。
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 行之前刷新实体管理器
【问题讨论】:
标签: spring hibernate jpa entitymanager transactional