我正在創建一個簡單的彈簧應用程序,它應該在研討會中預定席位。比方說Booking
類看起來像這樣JPA Hibernate Spring存儲庫確保事務在保存時完成?
@Entity
@Table(name = "bookings")
@IdClass(BookingId.class)
public class Booking{
@Id
private Long seminarId;
@Id
private String seatNo;
// .. other fields like perticipant info
// .. getter setters
}
當然
的BookingId
類:
public class BookingId implements Serializable{
private static final long serialVersionUID = 1L;
private Long seminarId;
private String seatNo;
// .. constructors, getters, setters
}
而且我有一個repository
@Repository
public interface BookingsRepository extends JpaRepository<Booking, BookingId>{
}
控制器
當預訂請求到達時我第一次檢查如果已經存在具有相同seminer id和座位號的預訂,如果它不存在,我創建一個
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<BaseCrudResponse> createNewBooking(@Valid @RequestBody NewBookingDao newBookingDao, BindingResult bindingResult){
logger.debug("Request for a new booking");
// .. some other stuffs
Booking newBooking = new Booking();
newBooking.setSeminarId(newBookingDao.getSeminarId());
newBooking.setSeatNumber(newBookingDao.getSeatNumber());
// .. set other fields
Booking existing = bookingsRepository.findOne(new BookingId(newBooking.getSeminarId(), newBooking.getSeatNumber());
if (existing == null)
bookingsRepository.save(newBooking);
return new ResponseEntity<>(new BaseCrudResponse(0), HttpStatus.CREATED);
}
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
現在,如果repository
的save
方法沒有寫完commiting交易,另一個請求已經獲得過去存在檢查會發生什麼?有可能是不正確的預訂(最後一次提交將覆蓋以前)。這種情況是否可能發生?存儲庫是否確保在另一次保存呼叫之前完成交易?
也就是有沒有辦法告訴JPA拋出一些異常(IntegrityConstraintException如果複合鍵(在這種情況下seminerId和seatNumber)已經存在呢?現在在本設置其剛剛更新該行。
所以可以說我有這種方法@Lock(LockModeType.PESSIMISTIC_WRITE) 預訂findOne(BookingId id);,只有在執行save()或findOne()之後纔會釋放鎖定? –