Если периоды времени одинаковы, я решил это, добавив уникальное ограничение (я использую жидкость):
Код: Выделить всё
Например:
р>
Код: Выделить всё
{
"userId": 7,
"startTime": "2024-07-04T12:00:00",
"endTime": "2024-07-04T14:00:00",
"location": {
"id": 2
}
},
{
"userId": 8,
"startTime": "2024-07-04T12:00:00",
"endTime": "2024-07-04T14:00:00",
"location": {
"id": 2
}
},
{
"userId": 9,
"startTime": "2024-07-04T13:00:00",
"endTime": "2024-07-04T15:00:00",
"location": {
"id": 2
}
}
Код: Выделить всё
{
"userId": 7,
"startTime": "2024-07-04T12:00:00",
"endTime": "2024-07-04T14:00:00",
"location": {
"id": 2
}
},
{
"userId": 8,
"startTime": "2024-07-04T12:00:00",
"endTime": "2024-07-04T14:00:00",
"location": {
"id": 2
}
}
Код: Выделить всё
{
"userId": 8,
"startTime": "2024-07-04T12:00:00",
"endTime": "2024-07-04T14:00:00",
"location": {
"id": 2
}
},
{
"userId": 9,
"startTime": "2024-07-04T13:00:00",
"endTime": "2024-07-04T15:00:00",
"location": {
"id": 2
}
}
Как я перед добавлением проверяю вот это:
Код: Выделить всё
@Transactional
public BookingDTO createBooking(Booking booking) {
Location location = locationRepository.findById(booking.getLocation().getId())
.orElseThrow(() -> new IllegalArgumentException("Location not found"));
boolean bookingEndsBeforeItStarts = booking.getEndTime().isBefore(booking.getStartTime());
if (bookingEndsBeforeItStarts) throw new IllegalArgumentException("Booking can't end before it starts.");
if (bookingRepository.existsOverlappingBooking(location.getId(), booking.getStartTime())) {
throw new IllegalArgumentException("Overlapping booking exists for the given location and time.");
}
try {
booking.setLocation(location);
Booking savedBooking = bookingRepository.save(booking);
return BookingMapper.toDTO(savedBooking);
} catch (OptimisticLockException ex) {
throw new IllegalStateException("Optimistic locking failure occurred", ex);
}
}
У меня есть попробовал сделать что-то подобное в классе репозитория:
Код: Выделить всё
@Lock(LockModeType.OPTIMISTIC_FORCE_INCREMENT)
Booking save(Booking booking);
Код: Выделить всё
Entity
@Table(name = "booking")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Booking {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id", nullable = false)
private Long userId;
@ManyToOne
@JoinColumn(name = "location_id", nullable = false)
private Location location;
@Column(name = "start_time", nullable = false)
private LocalDateTime startTime;
@Column(name = "end_time", nullable = false)
private LocalDateTime endTime;
@Version
@Column(nullable = false)
private Long version;
}
Мой вопрос: как я могу настроить это, чтобы оно работало с оптимистическая блокировка.
Мой репозиторий: https://github.com/VMM-MMV/BookingService
Подробнее здесь: https://stackoverflow.com/questions/787 ... g-datetime
Мобильная версия