我使自己成为一个休眠的小沙箱,以了解其工作原理。
到目前为止,我在所有基础知识上都做得很好。一切正常。
我只有一个未解决的问题。

简而言之,我有一个Rats实体和一个Sickness实体。
老鼠可以有一个单一的疾病。
关联已正确设置到数据库中,并且实体文件包括以下部分:

在大鼠类中:
[...]

@ManyToOne(fetch = FetchType.LAZY )
@Cascade({ CascadeType.SAVE_UPDATE, CascadeType.DELETE})
@JoinColumn(name = "Sickness_Id")
public Sickness getSickness() {
    return this.sickness;
}


[...]

在疾病课中:
[...]

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "sickness")
      @Cascade({ /*CascadeType.SAVE_UPDATE,*/ CascadeType.MERGE, CascadeType.REFRESH})
        public Set<Rats> getRatses() {
            return this.ratses;
        }


[...]

如果我用新的疾病创建新的Rats并保存了Rats,则级联将按预期工作,并且疾病也会自动添加到数据库中。
删除部分也起作用,当我删除Rats时,其疾病也被删除。

不起作用的是尝试创建疾病并尝试通过其SetRatses方法将其传播给许多老鼠:

String sick_name2 = "Tourista";
System.out.println("\nsetting new sickness: " + sick_name2 + " and assigning it to all rats");
                Sickness sickness2 = new Sickness();
                sickness2.setNom(sick_name2);

                 ArrayList<Rats> sickratsList =  (ArrayList<Rats>) session.createCriteria(Rats.class).list();//  new HashSet<Rats>();
                Set<Rats> sickRatsSet = new HashSet<Rats>();
                for(Rats rat : sickratsList){
                    sickRatsSet.add(rat);
                }
                sickness2.setRatses(sickRatsSet);
                session.save(sickness2);


对此进行调试表明,疾病已正确插入数据库中,所有老鼠均已正确设置了病态的RasSet字段。
但是...如果我检查Rats的状态,则其疾病尚未更新。

尝试设置CascadeType。进入疾病关系没有帮助。

我知道我可以用以下方法解决它:

ArrayList<Rats> sickratsList =  (ArrayList<Rats>) session.createCriteria(Rats.class).list();//  new HashSet<Rats>();
Set<Rats> sickRatsSet = new HashSet<Rats>();
for(Rats rat : sickratsList){
    rat.setSickness(seckness2);
    session.save(rat);


}

但是我想了解如何通过Sickness.setRatses做到这一点。
这样我以后就可以找到与多对多关系的方式(我想这将非常相似)。

提前谢谢。

最佳答案

双向关联具有所有者侧(无mappedBy属性的一面)和相反侧(具有mappedBy属性的一面)。

Hibernate仅在决定哪些实体彼此关联时才考虑所有者。

因此,将老鼠添加到疾病中不会使Hibernate将老鼠与该疾病相关联,因为这只会改变反面。您必须确定老鼠的病情。

请注意,在ManyToXxx注释上使用DELETE级联并没有多大意义。一旦删除了千只患有旅游者的老鼠之一,就没有理由从数据库中删除旅游者病。无论如何,这显然会引起异常,因为另外999只老鼠对外来病有外键。

10-06 13:44