hibernate中一对多的映射为什么引用set集合而不使用list?
set是无序不可重复的,list是有序可以重复的。set集合保证在这个集合中,没有重复的对象。
多对一|一对多
一的一方用set集合表示对多的引用
多的一方直接引用一的一方
一对多:
配置:
<set name="集合名" cascade="" inverse="">
<key column="外键列名数据库"/> //外键名不要和主键名重复
<one-to-many class="集合类型的类的全路径名"/>
</set>
多对一:
<many-to-one name="对象名" class="对象类的全路径" column="外键列名数据库"/>
cascade:级联操作【none默认不级联】 减少我们书写操作的代码。
级联:在操作一个对象的时候,是否会操作其相关联的对象。
save-update (级联保存更新) 如保存客户就顺便自动保存客户对应联系人
delete 删除时进行关联
all save-update +delete
inverse:反转关系维护,属于性能优化,关系的两端如果都书写了关系,那么两方都会发送维护关系的语句。这样,语句发生重复,我们可以使用inverse使一的一方放弃维护关系。
true :不维护关系
false:默认值。维护关系
设置inverse属性,在多对多种维护关联关系的影响?
1) 保存数据
有影响。
inverse=false ,有控制权,可以维护关联关系; 保存数据的时候会把对象关系插入中间表;
inverse=true, 没有控制权, 不会往中间表插入数据。
2) 获取数据
无。
3) 解除关系
有影响。
inverse=false ,有控制权, 解除关系就是删除中间表的数据。
inverse=true, 没有控制权,不能解除关系。
4) 删除数据
有影响。
inverse=false, 有控制权。 先删除中间表数据,再删除自身。
inverse=true, 没有控制权。 如果删除的数据有被引用,会报错! 否则,才可以删除。
在多对多中慎用级联cascade属性,几乎不用。
多对多的配置:
<set name=”集合名” table=”中间表名”>
<key column=”别人引用我”/>
<many-to-many class=”集合泛型类的路径” column=”我引用别人的字段”/>
</set>
如有不同见解,欢迎指正留言。。。