欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于Hibernate的inverse设置的一点理解

程序员文章站 2022-06-10 08:55:13
...

inverse用于控制关联关系由哪一方维护,通常在1对n关联中由“n”的一方维护关联关系;在n-n关联中根据情况来指定关联一方。

我们以顾客(Customer)和订单(Order)这个例子来说,顾客和订单是1对n的关系,通常我们会这样配置映射文件:

 

Customer.hbm.xml片段

<set name="orders" inverse="true">
    <key column="customer_id" />
    <one-to-many class="Order" />
</set>

Order.hbm.xml片段

<many-to-one name="customer" column="customer_id" class="Customer">

 

这样在数据库中,Order表通过引用Customer表的customer_id列作为外键而关联起来。

 

相信这不是很难理解,但这里有几个问题需要回答:

 

1. 设置inverse=true的含义是什么?

inverse设置为true,说明关联关系由相反的一方维护,在上面的例子中就是由Order对象来维护。

 

2. 为什么通常让n的一方维护关联关系呢?

让我们想想如果让1的一方来维护会怎样把。还以上面为例,这时是由Customer来维护关系,如果没有设定级联保存的话,维护一个Customer-Order关系,Hibernate需要3条SQL语句:

a. 插入一个Order记录;

b. 插入一条Customer记录;

c. 更新Order记录的customer_id字段;

之所以多出一条的原因是,Order并不维护关系,因此它的customer_id需要另外一条SQL来更新。

另一个原因是,由n的一方维护关系,似乎更直观。

ps:如果指定了外键列不能为空(Order表中customer_id not null),那么就只能由n的一方来维护了。

 

 

相关标签: hibernate inverse