2016-08-22 2 views
1

Я пытаюсь сохранить несколько записей в базе данных с помощью Hibernate. Я не открываю сеансы или не начинаю транзакции вручную, и я бы хотел избежать этого, если это возможно. Мой класс Service выглядит следующим образом:Hibernate - сохранение нескольких объектов за одну транзакцию

@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()); 
    } 
... 

} 

Теперь, каждый раз, когда я бегу, кроме метода, я хотел бы сохранить одну запись в базе данных, однако в нынешнем состоянии он сохраняет только последний элемент (я предполагаю, что это совершает только сделки в конце) Выход Sql:

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=? 

My repository класс не делает ничего кроме того, вызывающий метод.

Возможно ли сохранить несколько записей в базе данных в Hibernate при использовании аннотации Transactional? Я хотел бы сохранить эту аннотацию в моем классе обслуживания.

ответ

1

Попытка переместить 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)
  • В каждой другой итерации он обновляет тот же существующий объект (вставленный в первую итерацию)

Вам нужны отдельные экземпляры сущностей, если вы хотите сохранить их как отдельные записи db.

+0

Вау, я не знаю, какая разница, но это сработало, спасибо вам! :) –

+0

Я отредактировал свой ответ, надеюсь, что он освещает тему :) –

+0

Теперь все ясно, спасибо еще раз :) –

Смежные вопросы