Java 从关系级联实体时的休眠问题

Java 从关系级联实体时的休眠问题,java,hibernate,cascade,Java,Hibernate,Cascade,我给自己做了一个小小的冬眠沙箱来了解它是如何工作的。 到目前为止,我所有的基础都做得很好。一切正常。 我只有一个未解决的问题 简而言之,我有一个老鼠实体和一个疾病实体。 老鼠只会有一种病。 关联已正确设置到数据库中,实体文件包括以下部分: 在老鼠课上: [……] [……] 疾病类别: [……] @OneToMany(fetch=FetchType.LAZY,mappedBy=“生病”) @级联({/*CascadeType.SAVE_UPDATE,*/CascadeType.MERGE,Casc

我给自己做了一个小小的冬眠沙箱来了解它是如何工作的。 到目前为止,我所有的基础都做得很好。一切正常。 我只有一个未解决的问题

简而言之,我有一个老鼠实体和一个疾病实体。 老鼠只会有一种病。 关联已正确设置到数据库中,实体文件包括以下部分:

在老鼠课上: [……]

[……]

疾病类别: [……]

@OneToMany(fetch=FetchType.LAZY,mappedBy=“生病”)
@级联({/*CascadeType.SAVE_UPDATE,*/CascadeType.MERGE,CascadeType.REFRESH})
公共集getRatses(){
把这个还给我;
}
[……]

如果我创建了一个带有新疾病的新老鼠并保存了这些老鼠,那么级联将按预期工作,疾病也会自动添加到数据库中。 删除部分也起作用,当我删除一只老鼠时,它的疾病被删除

不起作用的是试图制造一种疾病,并试图通过其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);
String sick_name2=“Tourista”;
System.out.println(“\n设置新疾病:+sick_name2+”并将其分配给所有大鼠”);
疾病2=新疾病();
病态2.setNom(病态名称2);
ArrayList sickratsList=(ArrayList)session.createCriteria(Rats.class).list();//新HashSet();
Set sickRatsSet=newhashset();
用于(大鼠:病鼠列表){
病态组添加(大鼠);
}
病态2.设置(病态设置);
抢救(疾病2);
对此进行调试表明,该疾病已正确插入数据库,其sickRatsSet字段已与所有老鼠一起正确设置。 但是如果我检查老鼠的状态,它们的病情还没有更新

正在尝试设置类型。陷入病态的关系没有帮助

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

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);
ArrayList sickratsList=(ArrayList)session.createCriteria(Rats.class).list();//新HashSet();
Set sickRatsSet=newhashset();
用于(大鼠:病鼠列表){
大鼠坐姿(seckness2);
会话保存(rat);
}

但我想了解如何通过疾病来做到这一点。 这样我以后就可以通过多对多关系找到自己的路(我想这会很相似)


Thx提前。

发生此错误是因为您正在检索已缓存在一级缓存(会话)中的对象,而这些对象的双向关联设置不正确。在您的代码中,您永远不会调用
rat.setSickeness(disease)

尝试调用以下方法并检查数据是否正确

session.flush()
session.clear()
// load the rats /sickness again and the relations should be set.
底线:当你有一个双向关联时,开发者的责任是在两端添加/设置对象,否则你会陷入这个错误。解决此问题的最简单方法是,在两个对象中的一个对象中只有一个方法知道如何维护关联。比如说

public class Rat {
   public void setSickness(Sickness sickness) {
      this.sicknesses = sickness;
      sickness.addRat(this);
   }
}

public class Sickness {
   // leave this as package protected! So the only way to set the association is from the Rat
   void addRat(Rat rat) {
      rats.add(rat);
   }
}

您可能需要阅读有关会话及其作为一级缓存的工作方式的Hibernate文档。

发生此错误的原因是您正在检索已缓存在一级缓存(会话)中的对象,而这些对象的双向关联设置不正确。在您的代码中,您永远不会调用
rat.setSickeness(disease)

尝试调用以下方法并检查数据是否正确

session.flush()
session.clear()
// load the rats /sickness again and the relations should be set.
底线:当你有一个双向关联时,开发者的责任是在两端添加/设置对象,否则你会陷入这个错误。解决此问题的最简单方法是,在两个对象中的一个对象中只有一个方法知道如何维护关联。比如说

public class Rat {
   public void setSickness(Sickness sickness) {
      this.sicknesses = sickness;
      sickness.addRat(this);
   }
}

public class Sickness {
   // leave this as package protected! So the only way to set the association is from the Rat
   void addRat(Rat rat) {
      rats.add(rat);
   }
}

您可能需要阅读有关会话及其作为一级缓存的工作方式的Hibernate文档。

发生此错误的原因是您正在检索已缓存在一级缓存(会话)中的对象,而这些对象的双向关联设置不正确。在您的代码中,您永远不会调用
rat.setSickeness(disease)

尝试调用以下方法并检查数据是否正确

session.flush()
session.clear()
// load the rats /sickness again and the relations should be set.
底线:当你有一个双向关联时,开发者的责任是在两端添加/设置对象,否则你会陷入这个错误。解决此问题的最简单方法是,在两个对象中的一个对象中只有一个方法知道如何维护关联。比如说

public class Rat {
   public void setSickness(Sickness sickness) {
      this.sicknesses = sickness;
      sickness.addRat(this);
   }
}

public class Sickness {
   // leave this as package protected! So the only way to set the association is from the Rat
   void addRat(Rat rat) {
      rats.add(rat);
   }
}

您可能需要阅读有关会话及其作为一级缓存的工作方式的Hibernate文档。

发生此错误的原因是您正在检索已缓存在一级缓存(会话)中的对象,而这些对象的双向关联设置不正确。在您的代码中,您永远不会调用
rat.setSickeness(disease)

尝试调用以下方法并检查数据是否正确

session.flush()
session.clear()
// load the rats /sickness again and the relations should be set.
底线:当你有一个双向关联时,开发者的责任是在两端添加/设置对象,否则你会陷入这个错误。解决此问题的最简单方法是,在两个对象中的一个对象中只有一个方法知道如何维护关联。比如说

public class Rat {
   public void setSickness(Sickness sickness) {
      this.sicknesses = sickness;
      sickness.addRat(this);
   }
}

public class Sickness {
   // leave this as package protected! So the only way to set the association is from the Rat
   void addRat(Rat rat) {
      rats.add(rat);
   }
}

您可能需要阅读Hibernate文档,了解会话及其作为一级缓存的工作原理。

双向关联有一个所有者端(不带
mappedBy
属性的端)和一个反向端(带
mappedBy
属性的端)

Hibernate在决定哪些实体相互关联时只考虑所有者方

因此,将老鼠添加到疾病中不会使Hibernate将老鼠与疾病联系起来,因为这只会改变疾病的反面。你必须