简单的hibernate自引用 - 父子关联

时间:2012-09-17 22:22:19

标签: hibernate parent-child

课程

class Bean {

private List<Radicacion> getReferencias() {
    List<Radicacion> refs = DAO.findAll(Radicacion.class);
    return refs;   
}

private Radicacion getRadicacion() {  
    Radicacion r = DAO.findById(Radicacion.class, new Integer(33) );
    return r;
}

private void guardarDependencias() {
    Iterator<Radicacion> itRad = getReferencias().iterator();
    while (itRad.hasNext()){
        Radicacion ref = itRad.next();          
        getRadicacion().getRadicacions().add(ref);
        ref.setReferencia(getRadicacion());             
    }
}
}

////////

class Radicacion {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "referencia")
public List<Radicacion> getRadicacions() {
    return this.radicacions;
}
public void setRadicacions(List<Radicacion> radicacions) {
    this.radicacions = radicacions;
}

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "referencia_asociada")
public Radicacion getReferencia() {
    return this.referencia;
}
public void setReferencia(Radicacion radicacion) {
    this.referencia = referencia;
}           

}

问题

我需要getReferencias()方法提供的所有Radicacion对象最终都在getRadicacion()。getReferencias()集合中。

每当我调用guardarDependencias(用英语保存依赖项)时都没有任何反应。原始的getRadicacion.getReferencias()保持不变。

需要思考的事情

  • 如果我插入DAOBase.merge(ref);在迭代中,它不会产生任何sql输出。它让我认为ref已经被加载为持久性,所以当我将链接设置为getRadicacion()时,为什么hibernate无法更新其状态?

  • 如果我插入System.out.println(HibernateUtil.getCurrentSession()。contains(ref));在迭代器中,它打印出真实。

  • 如果我创建其他的asociations,持久性工作正常。问题可能与自我引用有关。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你的代码建议你想要将所有Radicacions(你通过(DAO.findAll(Radicacion.class))添加到ID为33的Radicacion.Radicacion也是自引用的,它也引用了它自己作为一个集合 Radicacion(亲子关系)

你要检查的第一件事是,如果方法guardarDependencies在一个事务中运行?我没有看到任何交易管理代码。如果在会话使用期间没有输出sql(并且你期望它),那么第一个怀疑是它是否在一个事务下运行。

你也可以在DEBUG模式下运行Hibernate,看看幕后发生了什么。找到根本问题非常有帮助