1.
“set的inverse属性决定是否把对set的改动反映到数据库中去。
inverse=false————反映;inverse=true————不反映”
inverse属性默认为false
以一对多为例子:Person(one方)---Address(many方)
- <set name="address" table="address" cascade="all"
- inverse="true">
- <key>
- <column name="pid" length="32" />
- </key>
- <one-to-many class="org.hibernate.demo06.pojo.Address" />
- </set>
当我们更新Person的时侯,我们同时per.setAddress(null);
inverse =false 执行了hql如下:
Hibernate: update mldn.person set name=?, age=? where pid=?
Hibernate: update mldn.address set pid=null where pid=?
inverse =true 执行了hql如下:
Hibernate: update mldn.person set name=?, age=? where pid=?
可以看出:
inverse=false时,对Person的Address-set的改变会更新数据库中的address表,既是数据库保存了修改。
注:inverse 对set + one-to-many 和 set + many-to-many 起的作用不同。hibernate生成的sql不同。
对one-to-many,hibernate对many方的数据库表执行update语句。
对many-to-many, hibernate对关系表执行insert/update/delte语句,注意不是对many方的数据库表而是关系表。
建议:只对set + many-to-many设置inverse=false,其他的标记不考虑inverse属性,都设为inverse=true。
对cascade,一般对many-to-one,many-to-many,constrained=true的one-to-one 不设置级联删除。