2014-07-08 29 views
0

我正在調試基於Java的Web應用程序。還有就是多個記錄插入表從我們的生產 環境報告的問題,但其他記錄無效爲什麼Oracle/Java在一次執行中創建多個記錄?

生產問題的結果:

頭表

HDR_NO   HDR_COL1   HDR_COL1   DOCUMENT_DATE
HDR44               2014年6月6日14時22
HDR45               2014年6月6日14:24 - 無效數據
HDR46               2014年6月6日14:24 - 無效數據

細節表

DTL_NO     HDR_NO DTL_COL1   DTL_COL1
DTL76       HDR44     SR1439 4337  
DTL77       HDR45     SR1439 4337   - 無效數據
DTL78     HDR46     SR1439  個  4337 - 無效的數據

生產問題的結果:

預期的結果:爲每個表只能有一個記錄)。

我試圖通過發送三個連續的httpservletrequest在我的本地環境中複製此問題。
我們的驗證過濾了兩個請求,因爲它會嘗試插入三個具有與id相同的HDR_NO的
標頭實例。
在我的測試中爲每個表插入一條記錄。我現在的問題是,是什麼導致了這個錯誤?
我的代碼看起來像下面的代碼。請幫忙。
由於提前,

public class MyController extends SimpleFormController{ 
    public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,Object 
    private MyService myService 
    command, BindException errors){ 
     BeanParam bean = buildBeanParam(request); 
     myService.doTransaction(bean); 
    } 
} 
public class MyService{ 
    public void doTransaction(BeanParam bean){ 
     try{ 
      List Item items = getItems(bean);// query with one result 
      Header header = createHeader();//mysterious bug occur 
      populateDetails(header, items);//mysterious bug occur 
      } catch (GenerateIdException e) { 
      e.printStackTrace(); 
     } 
    } 
    public Header createHeader(){ 
     Header header = new Header(); 
     // generates a number with common prefix 
     header.setHeaderNo(headerNumberGenerator()); 
     header.setDocumentDate(new Date()); 
     header.setHdrcol1("String 1"); 
     header.setHdrcol2("String 2"); 
     return headerDao.save(header); 
    } 
    public void populateDetails(Header header, List;Item; items){ 
     for(Item item: items){ 
      //items.size() == 1, so one record in Detail Table is expected 
      Detail detail = new Detail(); 
      // generates a number with common prefix 
      detail.setDetailNo(detailNumberGenerator()); 
      detail.setDocumentDate(new Date()); 
      detail.setDtlcol1(item.getField1()); 
      detail.setDtlcol2(item.getField2()); 
      detail.setHeader(header); 
      detailDao.save(detail); 
     } 
    } 
} 

public class Header{ 
    @Id 
    @Column(name = "HDR_NO", length = 20) 
    private String headerNo; 

    @Temporal(TemporalType.DATE) 
    @Column(name = "DOCUMENT_DATE") 
    private Date documentDate; 

    @Column(name = "HDR_COL1") 
    private String hdrcol1; 

    @Column(name = "HDR_COL2") 
    private String hdrcol2; 

    @OneToMany(mappedBy = "header") 
    @Cascade(value = { CascadeType.PERSIST, CascadeType.MERGE }) 
    private List Details details; 
    //Getters and Setters 
} 
public class Details{ 
    @Id 
    @Column(name = "DTL_NO") 
    private String detailNo; 

    @ManyToOne 
    @JoinColumn(name = "HDR_NO", referencedColumnName = "HDR_NO") 
    private Header header; 

    @Column(name = "DTL_COL1") 
    private String dtlcol1; 

    @Column(name = "DTL_COL2") 
    private String dtlcol2; 
    //Getters and Setters 
} 
public class Item{ 
    @Column(name = "FIELD1") 
    private field1; 
    @Column(name = "FIELD2") 
    private field2; 
    //Getters and Setters 
} 
+0

是的......我不能在我的本地環境中複製這個... – dolf

+0

有沒有可能做遠程調試? – user75ponic

+0

由我們的用戶提供的步驟,我認爲這個問題不可能發生。不穩定的數據庫連接可能導致此錯誤嗎? – dolf

回答

0

這不是你的問題,你是怎麼做的「驗證」明確,但因爲數據庫允許重複它表明,驗證在應用層正在做,而且沒有主要/唯一的關鍵限制。

驗證你自己的麻煩是你如何在你運行SELECT檢查存在和何時INSERT,別人沒有偷聽和插入的時間?可能只有幾毫秒的差異,這就是爲什麼它很難複製。

+0

.hm發佈你的問題。也許我錯了,告訴我們的驗證器阻止來自三個連續請求的兩個請求。因爲我檢查了我的日誌,發現這個「HibernateOptimisticLockingFailureException」。 – dolf

相關問題