最近学习比较繁忙,老毛病又开始找上头了,但是写博客似乎成为了生活中不可缺少的一部分,起初只是为了能够督促自己能够踏实学习,但是现在已经不是简单的学习总结了,通过播客,认识了很多和我有共同爱好的朋友们,每天去将我的学习情况以及一些技术和他们交流已经成为我生活的一部分了。再次,感谢这个平台,感谢那些一直支持我的朋友们,在接下来的时间,我将更加努力完善播客内容。在接下来的几天,将和大家一起分享Hibernate相关知识。
一、集合映射
在持久化类中,有时会使用到值类型的对象属性,那么我们需要对值类型集合属性进行映射,需要用到集合映射。Hibernate支持的集合接口有set,list,map等,相对应在对象映射文件中,class元素有对应的<set>,<list>,<map>等,此外还可以用<bag>,<idbag>,<primitive-array>和<array>元素。
1.映射set
eg:我们有一个学生持久化类,他对应很多的个人爱好,那么我们可以将个人爱好作为一个值类型的集合放到实体类员工中,那么在映射文件中按如下设置:
<set name=“hobbies”table="student_hobby">
<key column=“STUDENT_ID” />
<element type="string" column="hobby_name" not_null="true"/>
</set>
其中name属性是指要映射的属性名,table属性是指定对应的数据库表名,key子元素指定集合属性对应表的外键列,element子元素映射集合内的元素
其他的的设置方式都差不多,这里就不一一列出了。只是要根据我们实际的业务要求,选择不同的集合,bag主要允许重复元素和无序,list是可重复有序,map强调键值对
二、组件映射
Hibernate建议在进行领域模型建模的时候要细粒度一些,也就是类要比表多,这就是组件映射方式。
eg:一个客户有家庭地址和公司地址,在表中相应都对应省市政及街道4个字段,共八个字段,再加上其他字段,这样设计粒度太粗,那么我们可以将这个地址抽象出一个值类型的地址类,然后再客户类中实例化两个地址类即可。映射文件设置如下:
<component name="homeAddress" class="Address">
<property name="province" column ="home_province" />
<property name="city" column ="home_city" />
<property name="detail" column ="home_detail" />
<property name="street" column ="home_street" />
</component>
同样设置公司地址就可以了。注意,当集合中的元素是组件类的时候,我们用composite-element元素来设置。
三、关联关系映射
不同持久化类之间的一种结构关系
1.单向多对一(多个员工属于同一部门)
需要设置<many-to-one>元素。
2.单向一对多(同一部门有多个员工)
需要在set元素中设置<one-to-many>元素
3.一对一(一个人只有一张身份证)
方式一:基于唯一外键
方式一样是设置<many-to-one>元素,不同需要设置属性unique为true,级联属性cascade为all。
方式二:基于主键
这时我们需要在映射文件两处修改,一个是主键生成策略应该改为foreign,然后增加子元素param子元素指定是用property属性指定的那个属性,然后增加<one-to-one>,属性constraints设置为true
4.多对多
设置many-to-many元素。