Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA Hibernate Spring存储库确保事务在保存时完成?_Spring_Hibernate_Jpa - Fatal编程技术网

JPA Hibernate 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

我正在创建一个简单的spring应用程序,它应该在研讨会上预定座位。让我们假设
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()之后才会释放?