合并期间JPA多对多关联在连接表中删除记录

时间:2013-12-11 15:44:13

标签: 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.已在反面进行了映射

我有3个与一个解析器关联的脚本对象 - 在cf_script_parser连接表中有3个记录。 当我添加另一个解析器时 - 我应该有相同的3个脚本对象与新的解析器相关联,另外3个记录在连接表会计中总共6个记录。

但是我看到以下情况 1.连接表中的前三个记录之一被删除,第二个解析器的3个新记录被插入。 2.存在第一个解析器的3个记录,但第二个解析器只插入2个。

对于上述两种情况,共有6条记录而不是连接表中的5条记录... 任何人都可以帮助我找不到的地方,如果需要任何细节,请告诉我。

提前致谢

添加更多代码 - 记录器将迭代来自scheduledReport对象的设备类型和来自设备类型的CFScript,然后是Parsers。 预定的报告和设备类型不在讨论范围内,因为在本文中讨论了具有ManyToMany关联的Parser CFscript。

控制器端

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);
        }
}

并在bean中使用相同的logger语句

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);
    }

1 个答案:

答案 0 :(得分:0)

问题(在控制器和Bean中具有相同数量的记录)通过在CFScript和Parser中更改Set to Collection来解决。