0

课程

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)); 在迭代器中,它打印出 true。

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

谢谢你的帮助

4

1 回答 1

0

您的代码表明您希望将所有 Radicacions (您通过 (DAO.findAll(Radicacion.class) 获得的所有 Radicacion 添加到 ID 为 33 的 Radicacion 中。Radicacion 也是自引用的,即它具有对自身的引用以及Radicacion 集合(父子关系)

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

您还可以在 DEBUG 模式下运行 Hibernate 并查看幕后发生的情况。解决根本问题非常有帮助

于 2012-09-18T07:07:09.347 回答