Hibernate二次笔记 表的相互关联 inverse反转

本文介绍Hibernate中如何通过设置inverse属性避免重复SQL语句的生成,优化一对多和多对一关联关系的数据持久化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下面有两张表:1.CUSTOMER    ID (PK)      2.ORDERS          ID C_ID(FK)

下面是两表之间的代码:

 try {
            
// Create some data and persist it
            tx = session.beginTransaction();

            Customer customer 
= new Customer("Tom"new HashSet());
            Order order 
= new Order();
            order.setOrderNumber(
"Tom_Order001");

            order.setCustomer(customer); 
//将订单中的所属人属性加入
            customer.getOrders().add(order);//取得用户订单list,追加新订单

            session.save(customer);
            tx.commit();
        } 

而这两句话就相当于在hibernate中产生两条SQL语句:

UPDATE ORDERS SET ORDER_NUMBER='?', CUSTOMER_ID=WHERE ID=?;
UPDATE ORDERS SET CUSTOMER_ID=WHERE ID=?;

但这两条代码的功能是一样的,只是修改了一条ORDERS表的一条记录。

其实原理是这样的:

1.建立Orders对象到Customer对象的多对一关联关系:order.setCustomer(customer);

hibernate后台产生的SQL:UPDATE ORDERS SET ORDER_NUMBER='?', CUSTOMER_ID=WHERE ID=?;

2.建立Customer对象到Order对象的一对多关联关系:customer.getOrders().add(order);

hibernate后台产生的SQL:UPDATE ORDERS SET CUSTOMER_ID=WHERE ID=?;

重复执行多余的SQL语句会影响JAVA应用的性能,解决这一问题的办法是把<set>元素的inverse属性设为true,该属性的默认值为false:

     <set 
        
name="orders"
        inverse
="true"
        cascade
="save-update" 
        
>
        
        
<key column="CUSTOMER_ID" />
        
<one-to-many class="mypack.Order" />
     
</set>    

反转属性,这时Customer端的关联只是Order端关联的镜像。这里Hibernate只会生成一条SQL语句:UPDATE ORDERS SET ORDER_NUMBER='?', CUSTOMER_ID=WHERE ID=?;

即便注释掉了//customer.getOrders().add(order);也不会影响到hibernate的执行;反之,注释掉//order.setCustomer(customer); Hibernate将不会执行任何SQL。但还是推荐在程序中代码写入双关联,增加程序的健壮性,不会受到hibernate的影响。

另外解除关联的原理也是一样:customer.getOrders().remove(order);  order.setCustomer(null);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值