关于Hibernate的inverse设置的一点理解
程序员文章站
2022-06-10 08:55:49
...
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的一方来维护了。
推荐阅读