2010-01-03 传智播客—hibernate加强与二级缓存(转载)
???? 从昨晚后半夜开始下午,现在外面的雪还没停,这是来北京后最大的一场雪。早上6:30起床,然后去吃早餐。今天是元旦假期的最后一天,幸好乘车的人不多,很快就坐上了车。如果是平时可能得在大雪里走几站,甚至走到学校。气温还可以,在外面等车时,雪好美!
今日继续讲解hibernate,也是hibernate课程的最后一天。Hibernate的内容非常多,如果详细着讲估计还得两天,但课程安排是三天。大部分之前的学生说外面用hibernate的很少!~~ 无奈!继续上一次课程…。
接下来我们继续学习关联级别的一对一检索策略与多对多检索策略。
1).外键关联,此种解决方案有两种方法:
老徐举的例子,一个用户表对应一个地址。为什么要这么做?假设地址中包含大字段,这样可以减少资源的浪费,提高访问性能。
l????????? 方法一、就是在多对一关联的元素节点中添加一个unique=”true”属性便形成了一对一关联。
在用户类的映射文件中添加:
<!-- 影射一对一外键关联用many-to-one进行模拟,增加唯一性约束 -->
在地址类的映射文件中添加:
l????????? 方法二、直接使用一对一关系:
在用户类的映射文件中添加:
<!-- 影射一对一主键关联 -->
在地址类的映射文件中添加:
<id name="id" column="id" type="integer">
??? <generator class="foreign">
?????? <param name="property">user</param>
??? </generator>
2).主键关联,此时子表的主键与主表的主键一一对应。有三种解决方案:
老徐举了一个例子:员工有钟点工和普通工人之分,钟点工领取的是时效工资(rate),普通工人领取的是月薪(salary)。所以我们有必要提取一个员工的超类,并分别实现钟点工和普通工人的子类。
l????????? 方法一、我们将钟点工和普通工人的信息放到一个表里,需要在映射文件中添加:
<!-- 区分符 -->
<discriminator column="etype" type="string" length="2" />
<property name="name" column="name" type="string" length="15" />
<!-- 子类(整个继承关系树对应于一个表) -->
<subclass name="HeSingle" discriminator-value="he" lazy="false">
??? <property name="rate" column="rate" type="float" />
</subclass>
<subclass name="SeSingle" discriminator-value="se" lazy="false">
??? <property name="salary" column="salary" type="float" />
注意“discriminator”元素用于定义一个额外的列,用于区分员工的类型。
l????????? 方法二、我们为每类员工都分别建一个表,如:
<!-- 每个子类对应一个表,从表和主表间一对一关系 -->
<joined-subclass name="HeJoined" table="hib_hejoineds" lazy="false">
??? <key column="eid" />
?? <property name="rate" column="rate" type="float" />
</joined-subclass>
??????
<joined-subclass name="SeJoined" table="hib_sejoineds" lazy="false">
??? <key column="eid" />
??? <property name="salary" column="salary" type="float" />
“column="eid"”被做为外键对应主表的员工id。
l????????? 方法三、为每类员工建立一个表,他们与主表无关各自具有全字段。但是这三个表所使用的Id是不重复的:
<union-subclass name="HeUnion" table="hib_heunions">
??? <property name="rate" column="rate" type="float" />
</union-subclass>
<union-subclass name="SeUnion" table="hib_seunions">
??? <property name="salary" column="salary" type="float" />
<id name="id" column="id" type="integer">
??? <generator class="hilo">
?????? <param name="table">hib_hilo</param>
?????? <param name="column">currvalue</param>
?????? <param name="max_lo">10</param>
??? </generator>
<set name="stus" table="hib_tea_stu_links" lazy="false">
?????? <key column="tid" />
?????? <many-to-many class="Stu" column="sid" />
<set name="teas" table="hib_tea_stu_links" lazy="false" inverse="true">
?????? <key column="sid" />
?????? <many-to-many class="Tea" column="tid" />
(1)一对多或者多对多关联
(2)应用程序不需要立即访问或者根本不会访问的对象EN-U