Hibernate 關聯關係中toString引起的死循環

在使用 Hibernate 建立關聯關係時,由於測試使用的 toString 方法不當,引起了互相遞歸調用的死循環,具體情況如下:

建立數據庫表對應的 Bean 類
Customer. java

    private int customer_id;
    private String customer_name;
    private Set<Order> orders;
    @Override
    public void toString(){
        return "Customer [customer_id=" + customer_id + ", 
        customer_name=" + customer_name + ", order=" + order + "]";
    }

Order. java

    private int order_id;
    private String order_name;
    private Customer customer;
    .......//省略 getter & setter
    @Override
    public String toString() {
        return "Order [order_id=" + order_id + ", order_name=" + 
        order_name + ", customer_id=" + customer + "]";
    }

此處主要測試的是 Hibernate 中的“雙向一對多”的關聯關係,例子中:Customer 顧客可以有多個 Order 訂單;由於測試時結果的展示是通過複寫toString方法來實現,所以直接 Source –> toString( ),自動生成。

在後來執行結果時報出的異常,是 StackOverFlow 異常,也就是棧內存溢出;細查找原因:原來是在查其中一個結果時,例如查找 Customer的數據,調用 toString 方法,但是在 Customer 的 toString 中存在 order 對象,故又調用了 Order 的 toString 方法,而 Order 中的 toString 存在 Customer 對象,故又返回去調用了 Customer 的 toString……..如此遞歸死循環,造成了棧內存溢出。

解決辦法:
既然知道了原因,那解決就好辦了,在其中一個對象的 toString 中刪除對另外一個對象的 toString 引用就可以了,比如:

    customer --> customer.getCustomer_id()

將 Order 中 toString 方法裏的 customer 對象改爲getCustomer_id( ),這樣就不會遞歸調用彼此的 toString 方法了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章