当前位置: 首页 > 知识库问答 >
问题:

Hibernate-在一个事务中保存多个对象

庄博厚
2023-03-14
@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    @Autowired
    private ProductRepository productRepository;
    @Autowired 
    private OrderRepository orderRepository;
    @Autowired
    private CartService cartService;
    @Autowired
    private OrderDetailsRepository orderDetailsRepository;


...

public void saveOrder(Order order) {
        Cart cart=order.getCart();
        order.setTotalPrice(cart.getGrandTotal());
        OrderDetails od = new OrderDetails();
        od.setOrder(order);

        for (Map.Entry<Integer, CartItem> entry : cart.getCartItems().entrySet())
        {
            Product product = entry.getValue().getProduct();
            od.setProduct(product);
                od.setQuantity(entry.getValue().getQuantity());
            od.setUnitPrice(product.getUnitPrice());
            orderDetailsRepository.save(od);
        }

        cartService.delete(order.getCart().getCartId());
    }
...

}
Hibernate: 
    insert 
    into
        Orders
        (CustomerID, OrderDate, ShippingDate, TotalPrice) 
    values
        (?, ?, ?, ?)
Hibernate: 
    insert 
    into
        OrderDetails
        (OrderID, ProductID, Quantity, UnitPrice) 
    values
        (?, ?, ?, ?)
Hibernate: 
    update
        OrderDetails 
    set
        OrderID=?,
        ProductID=?,
        Quantity=?,
        UnitPrice=? 
    where
        OrderDetailsID=?

共有1个答案

秦珂
2023-03-14

尝试将OrderDetails声明移动到carItems循环:

 public void saveOrder(Order order) {
        Cart cart=order.getCart();
        order.setTotalPrice(cart.getGrandTotal());

        for (Map.Entry<Integer, CartItem> entry : cart.getCartItems().entrySet())
        {
            OrderDetails od = new OrderDetails();
            od.setOrder(order);

            Product product = entry.getValue().getProduct();
            od.setProduct(product);
            od.setQuantity(entry.getValue().getQuantity());
            od.setUnitPrice(product.getUnitPrice());
            orderDetailsRepository.save(od);
        }

        cartService.delete(order.getCart().getCartId());
    }
...

}

在您的原始代码中,Hibernate所做的是:

  • 在第一次迭代中,它保存在循环之前声明的OrderDetails实体(并为其生成id)
  • 在每隔一次迭代中更新相同的现有实体(在第一次迭代中插入)
 类似资料:
  • 问题内容: 我正在尝试使用hibernate模式写入多个数据库。我已经将写和读/写会话封装在单个会话对象中。但是,当我去保存时,出现很多错误,这些对象已与另一个会话关联:“非法尝试将一个集合与两个打开的会话关联” 这是我的代码: 我试图逐出该物体并冲洗;但是,这会导致“行被另一个事务更新或删除”问题,即使两个会话都指向不同的数据库。 除了上述内容,我还尝试使用hibernate的复制功能。没有错误

  • 我正在尝试编写一个简单的应用程序,其中包含一个跟踪每个用户支付的款项的表和一个包含每个用户支付的总金额(所有付款的总和)的第二个表。目前,两个表都有相同的字段(firstName、lastName、金额),我已经将它们从同一个Java类映射到多个表,我无法将该类映射到多个表。对此有什么简单的解决方案吗?

  • 问题内容: 在Session类的JavaDoc中,delete方法的描述为: 从数据存储中删除 持久性实例 。该自变量可以是与接收会话相关联的实例,也可以是具有与现有持久状态相关联的标识符的瞬时实例。 我的问题是: 我想删除一个分离对象,可以使用这种方法吗?AFAIK会话首先使对象从分离中持久化,然后执行其操作。我对吗? 如果不确定数据库中是否存在该对象,是否应该使用Session.get()检查

  • 是否可以使用Hibernate Spring对以下内容进行建模。 公开会议 我使用Spring TransactionTemplate,它同时执行会话事务生存期范围。 原因是,有时我在业务流程中有几个阶段,我希望在每个阶段完成后提交。但是,我希望继续使用相同的持久对象。如果每个事务都有一个单独的会话,则会出现暂时/分离的异常,因为原始会话已关闭。 这有可能吗?

  • 本文向大家介绍Spring如何在一个事务中开启另一个事务,包括了Spring如何在一个事务中开启另一个事务的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 spring使用@Transactional开启事务,而且该注解使用propagation属