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 方法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值