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 都能单独写在一个映射文件中
**************************************************************
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 都能单独写在一个映射文件中
**************************************************************
相关文章推荐
- hibernate笔记, 复习到7.2.2,333页
- 复习hibernate笔记 1
- hibernate笔记, 复习到6.4节
- Hibernate复习笔记(一)
- Hibernate 复习笔记一
- hibernate复习的笔记
- Hibernate复习笔记
- hibernate笔记,复习到5.1.2节
- hibernate笔记,复习到第八章之前,第八章打算跳过
- Hibernate学习笔记:难点,常见面试题
- socket网络编程复习笔记(四):认识套接字函数
- hibernate入门笔记(2)
- hibernate笔记--通过SchemaExport生成数据库表
- Linux高级编程复习笔记 第二章 映射虚拟内存 mmap gcc 静态库 动态库
- 新分类:C++复习笔记
- 学习笔记之 O/R 映射技术的王牌Hibernate框架
- 计量经济学复习笔记(二)
- mysql复习笔记2
- 数据库期末复习笔记
- 计量经济学复习笔记(三)修正版