我知道有很多帖子與我的問題有關。但我面對這個問題,即使按照博客中提到的步驟之後...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);
}
告訴我們,操縱數據和'等於()'/'的hashCode()'實現 –
確保您維護關係的雙方的代碼。如果連接表中的一行被刪除,很可能是因爲您正在刪除對解析器實例(來自Set'解析器')的CFScript引用併合並了這些更改。 – Chris
克里斯......你說得對。在合併/保持解析器關聯之一與CFScript在集合中丟失之前,當我檢查與CFScript關聯的解析器時。但我不刪除它,我不知道它是如何失蹤。我通過調用一個從控制器到Bean的方法在查找對象的幫助下傳遞對象...當我檢查日誌時,我看到整個集合傳遞對象時,並在Bean中迭代集合之一解析器對象在集合中缺失......我將在幾分鐘內發佈我的代碼......感謝Chris和Andrei :) – Hari