Последовательность гибернации застревает на значении 41 - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующая последовательность в моем классе -

@Entity
public class CustomerOrder {

   @Id
   @SequenceGenerator( name = "CUSTOMER_ORDER_INVOICE_NO_SEQ_NAME", sequenceName = "CUSTOMER_ORDER_INVOICE_NO_SEQ", allocationSize = 20 )
   @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_ORDER_INVOICE_NO_SEQ_NAME" )
   private int id;

   private long orderInvoiceNo;

   //.. getters and setters

}

Это класс репозитория данных весны, имеющий метод для получения next_val

  @Repository
  public interface CustomerOrderRepository
    extends CrudRepository<CustomerOrder, Long>, JpaSpecificationExecutor<CustomerOrder> {

     @Query( value = "SELECT next_val FROM CUSTOMER_ORDER_INVOICE_NO_SEQ", nativeQuery = true )
     Long getNextOrderInvoiceNoSeq();
 }

Мне нужно получить next_val изпоследовательность и передать это значение в двух разных местах.Поэтому я вызываю метод getNextOrderInvoiceNoSeq () моего репозитория и сохраняю значение как orderInvoiceNo -

@Autowired
private CustomerOrderRepository customerOrderRepository;

public void placeCustomerOrder( CustomerOrder customerOrder )
{

 long orderInvoiceNo = customerOrderRepository.getNextOrderInvoiceNoSeq();
 customerOrder.setOrderInvoiceNo(orderInvoiceNo);

 // using the same orderInvoiceNo to my other pojo
 // CustomerPurchase customerPurchase = new CustomerPurchase
 // customerPurchase.setOrderInvoiceNo(orderInvoiceNo);

 //....
 customerOrderRepository.save(customerOrder);
}


 @Entity
 public class CustomerPurchase {

   private String itemId;
   private long orderInvoiceNo;
   //.....     
 }

Итак, что происходит сейчас для первых двух итераций размещения customerOrder, я получаю orderInvoiceNo как 1 и 41,но после этого каждый раз я получаю 41 как next_val из последовательности, следовательно, делаю каждый заказ с тем же счетом no, который равен 41.

1 Ответ

0 голосов
/ 07 июня 2018

MySQL не имеет последовательностей, поэтому в этом случае Hibernate создаст генератор таблиц.

Hibernate сделает SELECT FOR UPDATE для получения последней next_val и UPDATE для увеличения значения:

SELECT next_val as id_val 
FROM CUSTOMER_ORDER_INVOICE_NO_SEQ FOR UPDATE

UPDATE CUSTOMER_ORDER_INVOICE_NO_SEQ 
SET next_val= 2 where next_val=1

getNextOrderInvoiceNoSeq() делает SELECT только для последнего значения, но не увеличивает его.

Тем не менее, я бы не рекомендовал это реализовывать.Было бы лучше переключиться на собственную последовательность и иметь внешний ключ CustomerOrder и CustomerPurchase.

...