集合映射与级联操作

来源:互联网 发布:php全栈开发工程师 编辑:程序博客网 时间:2024/05/12 00:09
1、组件映射
概念:关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。
当person中有一个简单类Name时候,它不够作为一个实体,而是一个类,想把它存到一张DB表里。
<component name="name">
<property name="firstName" column="first_name"></property>
<property name="lastName" column="last_name"></property>
</component>直接在配置文件中配置Name的类与属性,Name无映射文件
2、集合映射(set、map、list)
Set  没有元素添加的顺序,从而没有下标,在其中没有重复的元素存在  用的是<set></set>
<set name="hobbies" table="student_hobby">
<key column="student_id"></key>
<element type="string" column="hobby"></element>
</set>
List 有元素添加的顺序,有下表,在其中可以有重复的元素存在
<list name="emps">
<key column="depart_id" />
<list-index column="order_index"/>
<one-to-many class="Employee"/>
</list>
同理:bag也可以实现
<bag name="hobbies" table="student_hobbies">
<key column="student_id"></key>
<element type="string" column="hobbies_name"></element>
</bag>
Map  键值对    一个键对应一个值。如果添加的键名相同。则会覆盖掉以前的元素

<map name="hobbies" table="student_hobbies">
 <key column="student_id"/>
 <map-key type="long" column="hobby_id"/>
 <element type="String" column="hobbies_name"/>
</map>




3、集合类型:HashSet<Employee> set=(HashSet<Employee>) d.getEmps(); 会抛出异常
它返回的是PersistentSet ,hibernate在实现的时候,都将java中的集合  实现了对应的接口  Set接口
将HashSet 还成Set  因为PersistentSet同样也实现了Set接口。


4、集合映射(set, list, array,bag, map)
(1)这些集合类都是Hibernate实现的类和JAVA中的集合类不完全一样,set,list,map分别和JAVA中的Set,List,Map接口对应,bag映射成JAVA的List;这些集合的使用和JAVA集合中对应的接口基本一致;在JAVA的实体类中集合只能定义成接口不能定义成具体类, 因为集合会在运行时被替换成Hibernate的实现。


(2)集合的简单使用原则:大部分情况下用set,需要保证集合中的顺序用list,想用java.util.List又不需要保证顺序用bag。 

5、级联操作
s.save(dep);-----insert
update 当保存存在关联关系的指定对象。它不会自动保存它所关联的对象。


解决方法:级联操作。当保存在depart对象时,它会也自己将depart里面的所有员工也自动保存
在set标签内添加属性 cascade="save-update"  意思是当你保存部门对象时。也将员工的记录自动保存
如果又想做级联删除  则可以设置多个属性  cascade="save-update,delete";格式进行设置。如果设置
为all 则代表对象之间各种级联都要操作,同生共死的两个对象。
详述:cascade和inverse 
(1)Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:
none,all,save-update ,delete, lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many) 。
一般对many-to-one,many-to-many不设置级联,在<one-to-one>和<one-to-many>中设置级联。
(2)inverse表“是否放弃维护关联关系”(在Java里两个对象产生关联时,对数据库表的影响),
在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;
该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。
one-to-many维护关联关系就是更新外键。many-to-many维护关联关系就是在中间表增减记录。
注: 配置成one-to-one的对象不维护关联关系
在set标签内设置  inverse属性,为false代表失效,放弃维护关联关系。默认为true。
原创粉丝点击