spring data jpa一对多,save之后,子集新增后,老的数据没有删除,而是更新成为null

forai 发布于 2016/06/22 09:53
阅读 3K+
收藏 0

对象A


@Entity
@Table(name = "td_spider_cfg")
public class SpiderCfg implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String netName;
    private String columnUrl;
    private String netUrl;
    private String columnName;
    private String columnPattern;
    private String columnPagePattern;
    private int depth = 1;
    private int isPage ;
    private int isUpdateSpider;
    private int isRepeat;
    private String cron;
    private int threadNum = 3;
    private String spiderType;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @JoinColumn(name="cfgId")
    private Set<SpiderCfgPattern> targetPatterns;
}



对象B



@Entity
@Table(name = "td_spider_cfg_pattern")
public class SpiderCfgPattern implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String url;
    private String pattern;
    private Long cfgId;
}



我在更新对象A的时候,调用的是jpa的save方法。更新操作成功。但是关联的td_spider_cfg_pattern表里面之前的数据,并没有被删除,而是被update了。查看sql。如下:

,数据库里面出现了垃圾数据。(我的本意是想把之前在)td_spider_cfg_pattern表里面的关联数据删掉,再保存,但是jpa是update set=null ,然后保存。


请问我要怎么写代码,才能是正确的。

目前保存的代码如下:

@ResponseBody
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    public String save(SpiderCfg spiderCfg, String urls) throws Exception {
        String columnPattern = UrlPattern.build(spiderCfg.getColumnUrl()).getPathPattern().toString();
        spiderCfg.setColumnPattern(columnPattern);
        String[] turls = urls.split("\n");
        Set<SpiderCfgPattern> set = Sets.newHashSet();
        for (String url : turls) {
            if (StringUtils.isNotBlank(url)) {
                SpiderCfgPattern p = new SpiderCfgPattern();
                p.setUrl(url);
                p.setPattern(UrlPattern.build(url).getPathPattern().toString());
                set.add(p);
            }
        }
        spiderCfg.setTargetPatterns(set);
        SpiderCfg res = spiderService.saveSpiderCfg(spiderCfg);
        return "true";
    }



求各位帮我看看。


加载中
0
烟雨三月
烟雨三月
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphanRemoval=true)



烟雨三月
烟雨三月
回复 @forai : flag=1的不要放到set中去啊。
forai
forai
兄弟,如果我这里要删除的是其中某些(用标志位来区分,比如flag=1)的,要怎么操作呢?
forai
forai
谢谢兄弟啊,我搜索换了关键词 偶然看到了。
0
forai
forai

偶然找到了,在OneToMany标签里面要加上一个orphanRemoval=true,表明删除无关联的数据。


@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphanRemoval=true)
    @JoinColumn(name="cfgId")
    private Set<SpiderCfgPattern> targetPatterns;



王励志
王励志
就是这个 找了好久 谢谢你啊
返回顶部
顶部