2016-09-19 5 views
1

私はセミナーで座席を予約する予定の簡単なスプリングアプリケーションを作成しています。 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); 


} 

repositorysave方法は、トランザクションをコミット終了しませんでしたし、別の要求が既に存在チェックを過ぎて取得する場合何が起こるのだろうか?間違った予約がある可能性があります(最後のコミットは前のものを上書きします)。このシナリオは起こりそうですか?リポジトリは、別のセーブコールの前にトランザクションを完了することを保証しますか?

この場合にも複合キーは(seminerIdとseatNumber)がすでにそのだけの行を更新設定現在では今なのか?存在する場合IntegrityConstraintExceptionのために(いくつかの例外をスローするためにJPAを伝えるためにどのような方法があります。

答えて

1

ますロックは、エンティティを更新することはできません得たものを除いjavax.persistence.LockModeType.PESSIMISTIC_WRITEので、他のトランザクションを使用することができます

をあなたは春・データ> 1.6を使用している場合は、@Lockでリポジトリメソッドに注釈を付けることができます。

interface BookingsRepository extends Repository<Booking, Long> { 

    @Lock(LockModeType.PESSIMISTIC_WRITE) 
    Booking findOne(Long id); 
} 

コントローラーのトロンであるかもしれないロック例外を処理する必要があることを確認してください。

+0

私はこのメソッドを@Lock(LockModeType.PESSIMISTIC_WRITE) 予約するfindOne(BookingId id);私はsave()またはfindOne()の直後にロックが解放されますか? –

関連する問題