2013-12-11 26 views
0

我知道有很多帖子與我的問題有關。但我面對這個問題,即使按照博客中提到的步驟之後...JPA多對多關聯在合併過程中刪除連接表中的記錄

的實體是

@Entity 
@Table(name = "CF_SCRIPT") 
public class CFScript implements Serializable, Comparable<CFScript> { 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "CF_SCRIPT_PARSER", joinColumns = { @JoinColumn(name = "CF_SCRIPT_ID", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "PARSER_ID", nullable = false, updatable = false) }) 
    private Set<Parser> parsers; 

} 


@Entity 
@Table(name = "PARSER") 
public class Parser implements Serializable, Comparable<Parser> { 


    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "parsers") 
    private Set<CFScript> scripts; 

} 

有以下的東西,張貼在博客 - 1.實現equals和hashCode方法 2.有無在的mappedBy反側

我有3個腳本對象與一個解析器相關的 - 其中有3條記錄cf_script_parser連接表。 當我添加另一個解析器 - 我應該有相同的3個腳本對象關聯到新的解析器和3個記錄在連接表記帳總共6記錄。

但是,下面是我看到的情況 1.連接表中的前三條記錄中的一條被刪除,並且第二個分析器的三條新記錄被插入。 2.第一個解析器存在3條記錄,但第二個解析器只有2條記錄被插入。

對於上述兩種情況,它應該是總共6條記錄而不是5條連接表... 任何人都可以幫助我失蹤的地方,請告訴我是否需要任何詳細信息。

預先感謝

添加幾個碼 - 記錄儀將從設備類型,然後迭代解析器從scheduledReport對象和CFSCRIPT設備類型。 計劃的報告和設備類型不在本次討論之列,因爲它是CFScript的Parser,它具有此帖中討論的ManyToMany關聯。

控制器側

protected void save(boolean updateOnly) { 
     report.setChangeDate(new Date()); 
     for(DeviceType dt: report.getDeviceTypes()) { 
      logger.info("dt name ---> " + dt.getName() + " -- size -- " + dt.getScripts().size()); 
      for(CFScript script : dt.getScripts()) { 
       logger.info("script name --- " + script.getScriptId() + " -- size -- " + script.getParsers().size()); 
       for(Parser p : script.getParsers()) 
        logger.info("parser name ---> " + p.getName()); 
      } 
     } 
     if (updateOnly) { 
      report = scheduledReportEjbDAO.updateScheduledReport(report); 
     } 
} 

,並在豆

public ScheduledReport updateScheduledReport(final ScheduledReport scheduledReport) { 
     logger.info("-----------------one-----------------"); 
     for(DeviceType dt: scheduledReport.getDeviceTypes()) { 
      logger.info("dt name ---> " + dt.getName() + " -- size -- " + dt.getScripts().size()); 
      for(CFScript script : dt.getScripts()) { 
       logger.info("script name --- " + script.getScriptId() + " -- size -- " + script.getParsers().size()); 
       for(Parser p : script.getParsers()) 
        logger.info("parser name ---> " + p.getName()); 
      } 
     } 
     return updateScheduledReport(scheduledReport, false); 
    } 
+2

告訴我們,操縱數據和'等於()'/'的hashCode()'實現 –

+0

確保您維護關係的雙方的代碼。如果連接表中的一行被刪除,很可能是因爲您正在刪除對解析器實例(來自Set'解析器')的CFScript引用併合並了這些更改。 – Chris

+0

克里斯......你說得對。在合併/保持解析器關聯之一與CFScript在集合中丟失之前,當我檢查與CFScript關聯的解析器時。但我不刪除它,我不知道它是如何失蹤。我通過調用一個從控制器到Bean的方法在查找對象的幫助下傳遞對象...當我檢查日誌時,我看到整個集合傳遞對象時,並在Bean中迭代集合之一解析器對象在集合中缺失......我將在幾分鐘內發佈我的代碼......感謝Chris和Andrei :) – Hari

回答

0

問題同樣記錄語句(在控制器和豆有相同數量的記錄),得到了由改變設置爲收集解決在CFScript和Parser中。

相關問題