试验背景:
表:
Customer.java
Order.java
Customer.hbm.xml
Order.hbm.xml
级联保存与Customer对象相关的Order对象:
如果Customer.hbm.xml中set元素的属性inverse为true,则控制台输出的信息为:
如果Customer.hbm.xml中set元素的属性inverse为false(默认是false),则控制台输出的信息为:
发现这时,多执行了一条update语句。Why?
inverse=false分析:
当修改了Customer 对象的属性:
customer.getOrders().addOrder(order)
Hibernate 一旦知道持久态对象customer的上面的属性发生变化,执行相应的SQL语句:
update
HIBERNATE.ORDER_7
set
CUSTOMER_ID=?
where
ID=?
但如果将inverse=true,则customer与order之间的关系的控制被反转了,
Hibernate 监测到Customer对象上的属性发生变化,并不会去更新与该Customer对象相关的order记录。因为控制被反转了,
one 的一方(Customer)你变你的,我(Order)不会因为你的变化而被Hibernate控制,因为控制反转了,控制权不在你Customer一方,哈哈。我(many 一方)独立了!!
这样一来,我们在应用程序开发过程中为了提高性能,最好是在“one"方把<set>元素的inverse属性设置为true.