您的位置:首页 > 其它

Hibernate 复习笔记二

2008-09-18 01:21 134 查看
集合映射: 复杂映射的基础(后面总会用到)
set/list/map/idbag/bag

<set name ="#" table ="#">
<key>
<column name ="ID" precision ="22" scale ="0" not-null ="true" />
</key>
<element tyep ="java.lang.String" column ="topicname"/>
</set>

<element> 集合里有其它属性
precision 精度
scale 刻度

<set>集合的定义
<set
name ="propertyName" 集合属性的名称
table ="table_name" (可选)关联的数据库表名
lazy = "true|false" (可选)(默认false)延迟加载
inverse = "true|false" (可选)(默认false)哪一方为“主控方”(双向关系时用)
cascade ="all|none|save-update|delete|all-delete-orphan"
(可选)(默认none)级联操作
where ="SQL语句" (可选)(SQL 的 where 条件)
outer-join ="true|false|auto"
(可选)(默认auto)是否使用外联接
>
</set>

**************************************************************

关联映射:一对多/多对一

多: (many-to-one)
<many-to-one name ="#" class ="#" fetch ="select" cascade ="save-update">
<column name ="#" pecision ="22" scale ="0"/>
</many-toone>

一: (set one-to-many)
<set name = "#" cascade ="save-update">
<key>
<column name = "#" pecision ="22" scale ="0"/>
</key>
<ont-to-many class ="#"/>
</set>

设置了cascade ="save-update"以后,在代码实现的时候即可以保存“多”的一方,也可以保存“一”的一方。
这就涉及到保存哪一方效率高:
把“多”的一方作为“主控方” 这样效率会高。
所以在保存“一”的一方时,要把“主控权” 转交给“多”的一方这就需要对“一”的一方作些修改:
inverse ="true" + “双向关系”
<set name = "#" cascade ="save-update" inverse ="true">
<key>
<column name = "#" pecision ="22" scale ="0"/>
</key>
<ont-to-many class ="#"/>
</set>

“双向关系”: a.setB(b);
b.setA(a);

**************************************************************

一对一(外键关联)

外键关联典型的映射关系是:多对一,
一对一,其实是多对一关系中加以限制的一种特例,(外)
需要在映射文件中加上 unique ="true"

<many-to-one name ="address" class ="#" fetch ="select"
cascade ="all" outer-join ="true" unique ="true">
<column name ="#" precision ="22" scale ="0"/>
<many-to-one>

以上才实现单向的一对一,要完成双向一对一要再另一个配置文件中指定一对一关系(one-to-one)
<one-to-one name = "#" class ="#" property-ref ="address" cascade ="all"/>

?既然是“一对一”那边两个配置文件的写法能不能倒置呀。
这个不能对调。
这里所说的“一对一”其实也是一种“多对一”,
所谓“多对一”这里就有一个“多”,有一个“一”,
“多”的一方是表结构中包含 外键 的那一个表
“一”的一方是表结构中当做 外键 的那一个表
所以上面那种假设看似可以行的通。可这与底层的数据库是不相符的。
(不知道可以这样理解不)

**************************************************************

一对一(主键关联)

这种关联中,要求两个对象的主键必须保持一致,
通过两个表的主键盘建立关联关系,无须外键参与。
B表中的主键:aid是外键

A: aid(PK) aname
|
B: aid(PK)(FK) bname

A:
<one-to-one name ="#" class ="#" cascade ="all">

B:
<generator class ="foreign">
<param name = "property">a</param?> (表示主键关联到a对象)
</generator>

<one-to-one name ="a" class ="#" cascade ="all">

?主键的类型

**************************************************************

多对多

一般采用中间表的形式,将 多对多 转化成两个 一对多 

Student Student_Course Course
id(pk)---------studentid (pk)(fk) +---id(pk)
name courseid (pk)(fk)----| name

Student.hbm.xml

<set name ="course" table ="student_course" cascade ="save-update">
<key column ="STUDENTID"/>
<many-to-many class ="com.Course" column ="courseid" outer-join ="auto"/>
</set>

Course.hbm.xml

<set name = "students" table = "student_course" inverse ="true" cascade = "save-update">
<key column = "COURSEID"/>
<many-to-many class = "com.Student" column = "studentid" outer-join = "auto"/>
</set>

**************************************************************'

继承关系映射
Hibernate 有三种基本继承映射策略:
1.类继承关系树中每个类共用一个表
2.每个子类一个表
3.每个具体类一个表(不太清楚)

此为方式一:

父类: Employe
id
name
position "职称"
mgr_id "上级ID"

子类: Manager Clerk
-position:"manager" -position:"clerk"

产生一个映射文件:Employe.hbm.xml

<discriminator column ="position" type ="String"/>
..
<subclass name = "com.Clerk" discriminator-value ="clerk">
<many-to-one name ="manager" column ="mgr_id"
class = "com.Manager"/>
</subclass>

<subclass name = "com.Manager" discriminator-value = "manager">
<set name = "clerks" inverse = "true" lazy ="true" cascade = "all">
<key column = "mgr_id"/>
<one-to-many class = "com.Clerk"/>
</set>
</subclass>

由于本例中的两个子类:Manager、Clrek 在其中又是多对一、一对多关系。
所以出现在<subclass></subclass>中的代码

继承映射模式:
<discriminator column="能区分类的列"
subclass:
<subclass name="包名.子类名" discriminator-value="区分子类的条件">
//这里跟据此列与其它列或其它表的其它列的关系产生不同的
//这里放的是各子类各自的属性
</subclass>

方式二:按照对象的关系,创建数据模型

继承关系的对象映射多个表的数据
符合数据模型,(数据冗性)

eg:
表是三个表:
Employee , Manager , Clerk
映射文件:
只产生一个映射文件。也就是父类的(Employee)。子类在映射文件里用 joined-subclass 来生成。
1.
joined-subclass:
<joined-subclass name="包名.子类名" table="子类表">
<key>
<column name="子表主键" length="长度">
</key>
<property>
<column name="子表特有的列" length="长度"> (也可以说是各子类中各自怕属性)
</property>
</joined-subclass>

注:subclass 和 joined-subclass
都能单独写在一个映射文件中.
在这个独立的映射文件中,在<hibernate-mapping></hibernate-mapping>中只有这个<joined-subclass> 或是 <subclass>
这些映射文件一起生成类。

? <joined-subclass>
? subclass 和 joined-subclass 都能单独写在一个映射文件中

**************************************************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: