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

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的一方来维护了。

猜你喜欢

转载自jasonhan-sh-hotmail-com.iteye.com/blog/1549539
今日推荐