2012-09-17 41 views
0

的類簡單休眠自我referencig - 父子關聯

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; 
}   

} 

我需要這個問題

所有Radicacion由getReferencias()方法提供的對象最終在getRadicacion()。getReferencias()集合中。

每當我打電話給guardarDependencias(保存英語中的依賴關係)時,什麼都不會發生。原始的getRadicacion.getReferencias()保持不變。

事情思考

  • 如果我插入DAOBase.merge(REF);在迭代中,它不會產生任何sql輸出。它使我認爲ref已經被加載爲持久的,所以當我設置鏈接到getRadicacion()時,爲什麼hibernate無法更新它的狀態?如果我插入System.out.println(HibernateUtil.getCurrentSession()。contains(ref));如果我插入System.out.println(HibernateUtil.getCurrentSession()。contains(ref));在迭代器中,它輸出true。

  • 如果我創建其他asociations,持久性工作正常。這個問題可能與自我引用有關。

感謝您的幫助

回答

0

你的代碼什麼建議您要添加的所有Radicacions(你的(DAO.findAll(Radicacion.class)得到一個Radicacion ID爲33.又Radicacion是自參照這是它具有自身的引用以及具有 Radicacion(父子關係)的集合

,你應該檢查的第一件事是,如果該方法guardarDependencies在一個事務中運行?我不沒有看到任何事務管理代碼,如果在會話使用期間沒有輸出sql(你期望它)當第一個懷疑是它是否在交易中運行時。

你也可以在DEBUG模式下運行Hibernate,看看底下發生了什麼。這對於解決根本問題非常有幫助

+0

hi shailendra,你說得對,Radicacion是一個自引用類。至於事務代碼,它是一個過濾器,它爲每個請求開始一個新的事務,並在請求即將結束時進行提交。 –

+0

請參閱http://stackoverflow.com/questions/3393515/jpa-how-to-have-one-to-many-relation-of-the-same-entity-type和http://stackoverflow.com/questions/ 5329015/hibernate-annotations-self-referencing-class正確使用自引用關係 – Shailendra