2016-12-14 56 views
0

我有以下問題。我有一個AppointmentRequest類,它是看起來像這樣的實體:JPA同步驗證持續之前

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; 

這裏是EJB代碼驗證和持續appointmentRequest:

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

Validator EJB檢查時隙是否可用,以及是否應該保留appointmentRequest,但如果不是,則會引發異常。請求和響應通過SOAP Web服務進行,所以如果成功則服務返回true,如果該插槽已被預訂,則返回false。

當我逐個發送SOAP請求時,它一切正常。

但是,我製作了一個SOAP客戶端,它可以製作多個線程(模擬多個客戶端),並同時發送同一時間段的多個請求。在這種情況下,多個約會請求會被保存在一個時隙中。 發生這種情況是因爲驗證異步發生,並且多個線程同時通過驗證,所以多個實體持續存在,這不應該發生。

我該如何解決這個問題?通過將驗證添加到@Prepersist回調中,我獲得了更好的性能,但仍有時會將多個約會請求保存在相同的時隙中。

回答

0

我只想同步,並採取對性能的影響:

validator.slotAvailable(appointmentRequest.getTimeSlot()); 

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