私はセミナーで座席を予約する予定の簡単なスプリングアプリケーションを作成しています。 Booking
クラスはもちろん、このJPA Hibernate Spring Repositoryは、保存時にトランザクションが完了することを保証しますか?
@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
}
、予約要求はI最初のチェックを到着したとき、私は、コントローラ内repository
@Repository
public interface BookingsRepository extends JpaRepository<Booking, BookingId>{
}
を持っています同じセミナー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
方法は、トランザクションをコミット終了しませんでしたし、別の要求が既に存在チェックを過ぎて取得する場合何が起こるのだろうか?間違った予約がある可能性があります(最後のコミットは前のものを上書きします)。このシナリオは起こりそうですか?リポジトリは、別のセーブコールの前にトランザクションを完了することを保証しますか?
この場合にも複合キーは(seminerIdとseatNumber)がすでにそのだけの行を更新設定現在では今なのか?存在する場合IntegrityConstraintExceptionのために(いくつかの例外をスローするためにJPAを伝えるためにどのような方法があります。
私はこのメソッドを@Lock(LockModeType.PESSIMISTIC_WRITE) 予約するfindOne(BookingId id);私はsave()またはfindOne()の直後にロックが解放されますか? –