JPA Hibernate Spring存储库确保事务在保存时完成?
我正在创建一个简单的spring应用程序,它应该在研讨会上预定座位。让我们假设JPA Hibernate Spring存储库确保事务在保存时完成?,spring,hibernate,jpa,Spring,Hibernate,Jpa,我正在创建一个简单的spring应用程序,它应该在研讨会上预定座位。让我们假设Booking课程是这样的 @Entity @Table(name = "bookings") @IdClass(BookingId.class) public class Booking{ @Id private Long seminarId; @Id private String seatNo; // .. other fields like perticipant in
Booking
课程是这样的
@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
public interface BookingsRepository extends JpaRepository<Booking, BookingId>{
}
@存储库
公共界面BookingsRepository扩展了JpaRepository{
}
在控制器中,当预订请求到达时,我首先检查是否已经存在具有相同种子机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);
}
@RequestMapping(method=RequestMethod.POST)
public ResponseEntity createNewBooking(@Valid@RequestBody NewBookKingdao NewBookKingdao,BindingResult BindingResult){
logger.debug(“请求新预订”);
//…一些其他的东西
预订新预订=新预订();
newBooking.setseminard(newBookingDao.getseminard());
setSeatNumber(newBookingDao.getSeatNumber());
//..设置其他字段
Booking existing=bookingsRepository.findOne(新BookingId(newBooking.getseminard(),newBooking.getSeatNumber());
if(现有==null)
bookingsRepository.save(新预订);
返回新的ResponseEntity(新的BaseCrudResponse(0),HttpStatus.CREATED);
}
返回新的ResponseEntity(响应,HttpStatus.BAD_请求);
}
现在,如果存储库的save
方法未完成提交事务,并且另一个请求已通过存在性检查,那么会发生什么情况?可能存在不正确的预订(最后一次提交将覆盖上一次提交)。这种情况是否可能发生?存储库是否会确保在另一次保存调用之前完成事务
还有什么方法可以告诉Jpa抛出一些异常(如果复合键(在本例中为seminerId和seatNumber)的话,则为IntegrityConstraintException已经存在?现在在当前设置中,它只是更新行。您可以使用javax.persistence.LockModeType.eposistic\u写入,以便除获得锁的事务外的其他事务无法更新实体
如果使用spring data>1.6,则可以使用@Lock注释存储库方法:
interface BookingsRepository extends Repository<Booking, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Booking findOne(Long id);
}
接口BookingsRepository扩展存储库{
@锁(锁模式类型。悲观写入)
预订findOne(长id);
}
当然,您需要处理控制器中可能出现的锁定异常。因此,假设我有这个方法@Lock(LockModeType.悲观写入)Booking findOne(BookingId id);,那么锁是否只有在执行save()之后或在findOne()之后才会释放?