首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

2010-01-03 传智播客—hibernate增强与二级缓存(转载)

2012-10-08 
2010-01-03 传智播客—hibernate加强与二级缓存(转载)???? 从昨晚后半夜开始下午,现在外面的雪还没停,这是

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

热点排行