JPA在持久化之前同步验证

时间:2016-12-14 18:22:35

标签: java hibernate validation jpa soap

我有以下问题。我有一个AppointmentRequest类,它是一个如下所示的实体:

public class AppointmentRequest implements Serializable{
    private static final long serialVersionUID = 4075310313280246558L;
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence")
    @SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ")
    @Column(name = "APPOINTMENT_REQUEST_ID", nullable = false)
    private long requestId;
    @Version
    private long version;
    @Column(nullable=false)
    private String firstName;
    @Column(nullable=false)
    private String lastName;
    @Column(nullable = false)
    private long jmbg;
    @OneToOne
    private TimeSlot timeSlot;

时间段实体:

public class TimeSlot {
    @Id
    @Column(columnDefinition="TIMESTAMP(0)",nullable=false)
    private LocalDateTime dateTime;
    @OneToOne(mappedBy="timeSlot")
    private AppointmentRequest appointmentRequest;

以下是验证和保留appointmentRequest的EJB代码:

validator.slotAvailable(appointmentRequest.getTimeSlot());
entityManager.persist(appointmentRequest);

验证器EJB检查时隙是否可用以及是否应该保留为missionRequest,但如果不存在则抛出异常。请求和响应通过SOAP Web服务进行,因此如果成功则服务返回true,如果已经预订了插槽,则返回false。

当我逐个发送SOAP请求时,一切正常。

但是,我创建了一个SOAP客户端,它可以创建多个线程(模拟多个客户端)并同时向同一时隙发送许多请求。在这种情况下,多个appointmentRequest在一个时隙中保持不变。 这种情况正在发生,因为验证是异步发生的,并且多个线程的验证同时进行,因此多个实体会被持久化,这不应该发生。

我该如何解决这个问题?通过向@Prepersist回调添加验证,我获得了更好的性能,但有时仍然会在同一时隙中保留多个appointmentRequests。

1 个答案:

答案 0 :(得分:0)

我只是同步并获得性能提升:

validator.slotAvailable(appointmentRequest.getTimeSlot());

synchronized {
  validator.slotAvailable(appointmentRequest.getTimeSlot());
  entityManager.persist(appointmentRequest);
  entityManager.flush()
}