2013-08-26 74 views
0

往往是將有其中的關係是雙向的,例如映射實體圖。JPA實體,循環引用和toString()

class Home { 
    @Id 
    private Long id; 

    @OneToMany(mappedBy = "home") 
    Set<Room> rooms; 

    @Override 
    public String toString() { 
    return "Home [id=" + id + ", rooms=" + rooms + "]"; 
    } 
} 

class Room { 
    @Id 
    private Long id; 

    @ManyToOne 
    private Home home; 

    @Override 
    public String toString() { 
    return "Room [id=" + id + ", home=" + home + "]"; 
    } 
} 

這麼說,如果我們生產使用IDE的自動機制,我們可能會在不經意間的toString()方法的深刻遞歸,因爲家庭將打印客房,每間客房將依次打印其家庭toString方法。

是否有任何優雅的方式(特別是爲了調試目的)以清晰的類似toString的方式打印對象的圖形,而無需注意實施toString()方法以避免循環?

+1

只需打印整個家庭的'home.id'代替。 –

+2

做不注意通常是一個壞主意。請注意。通過協會的toString()方法導航通常是一個壞主意,因爲它會立即導致異常的關聯是懶惰和實體分離。 –

回答

1

如何做與Apache Commons Lang中以下

@Override 
public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
} 

這會給你的對象的一種反射表示。通過這種方式,你可以實現一個格式化程序,它可以遍歷對象圖形,並且很好地打印輸出,但不必擔心管理個別添加/刪除屬性。