我知道有很多与我的问题相关的帖子。但即使遵循博客中提到的步骤,我也会面对这个问题......
实体
@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);
}
答案 0 :(得分:0)
问题(在控制器和Bean中具有相同数量的记录)通过在CFScript和Parser中更改Set to Collection来解决。