Reputation: 87
I am using Spring data in my app (2.0.1). The app is REST-based service which add orders.
The order entity looks as follows:
@Entity
@Table(name = "orders")
@Data
@NoArgsConstructor
public class OrderEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Version
private int version;
private Date date;
private String post;
private BigDecimal totalAmount;
@Enumerated(EnumType.STRING)
private OrderStatus status;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
List<OrderSetEntity> sets;
private int dailyNumber;
private String documentNumber;
The posting or orders happens in OrderService:
public Long postOrder(OrderDTO orderDTO){
Date date = new Date();
OrderEntity order = new OrderEntity(date, orderDTO.getPost(), orderDTO.getPaymentMethod());
Integer dailyNumber = orderRepository.findDailyNumberByDate(date) + 1;
order.setDailyNumber(dailyNumber);
orderRepository.save(order);
return order.getId();
}
while findDailyNumberByDate is implemented this way:
@Override
public int findDailyNumberByDate(Date date) {
String sql = String.format("select max(o.dailyNumber) from OrderEntity o ");
Query query = entityManager.createQuery(sql);
Integer result = (Integer) query.getSingleResult();
if (result == null){
return 0;
}else {
return result.intValue();
}
Now I have a problem, that it get duplicated dailyNumber. The table isn't locked for reading when I am about to write into it. How can I achieve it?
I tried lockin the table - @Lock(LockModeType.PESSIMISTIC_WRITE) or query.setLockMode(LockModeType.PESSIMISTIC_FORCE_INCREMENT); but is still isn't working.
Thanks a lot for help
Upvotes: 1
Views: 1901
Reputation: 465
LockModeType can work in different ways with different databases, especially with Oracle db it gets a little tricky. A similar issue was answered here jpa lockmode type npt working as expected
Upvotes: 1