Hibernate4实战 之 第四部分:关系映射(一)

2014-11-24 08:26:58 · 作者: · 浏览: 0
数据表之间的关系分为三类:一对一、一对多、多对多
一对一数据表(部门表 和 部门主管表)
一对多数据表(部门表 和 部门下的人员表)
多对多数据表(部门表 和 人员表)

根据相互寻找的关系又分:单向和双向
对象一对一 (双向)

java代码:
1. public class A {
2. private B b = null; }
3. public class B {
4. private A a = null; }
5. n对象一对多 (双向)
6. public class A {
7. private B b = null; }
8. public class B {
9. private Collection colA = null; }
10. n对象多对多 (双向)
11. public class A {
12. private Collection colB = null; }
13. public class B {
14. private Collection
colA = null; }

双向一对多是最常用的映射关系
元素
元素在父映射元素定义了对新表的连接,并且在被连接表中定义了一个外键引用原表的主键的情况下经常使用。

java代码:
1. 2. column="columnname"(1)
3. on-delete="noaction|cascade"(2)
4. property-ref="propertyName"(3)
5. not-null="true|false"(4)
6. update="true|false"(5)
7. unique="true|false"(6)
8. />
(1)column(可选):外键字段的名称。也可以通过嵌套的 指定。
(2)on-delete(可选,默认是 noaction):表明外键关联是否打开
数据库级别的级联删除。
(3)property-ref(可选):表明外键引用的字段不是原表的主键(提供给遗留数据)。
(4)not-null(可选):表明外键的字段不可为空,意味着无论何时外键都是主键的一部分。
(5)update(可选):表明外键决不应该被更新,这意味着无论何时外键都是主键的一部分。
(6)unique(可选):表明外键应有唯一性约束,这意味着无论何时外键都是主键的一部分。
对那些看重删除性能的系统,推荐所有的键都应该定义为 on-delete="cascade",这样Hibernate 将使用数据库级的 ON CASCADE DELETE 约束,而不是多个 DELETE 语句用于映射集合类的
Hibernate映射元素取决于接口的类型。比如,元素用来映射Set类型的属性:

java代码:
1.
2.
3.
4.
5.
6.

7.

除了,还有, , , 映射元素。具有代表性 ,如下:

java代码:
1. 2. name="propertyName" (1)
3. table="table_name" (2)
4. schema="schema_name" (3)
5. lazy="true|extra|false" (4)
6. inverse="true|false" (5)
7. cascade=“all|none|save-update|delete|all-delete-orphan|delete-orphan”(6) sort="unsorted|natural|comparatorClass" (7)
8. order-by="column_name asc|desc" (8)
9. where="arbitrary sql where condition" (9)
10. fetch="join|select|subselect" (10)
11. batch-size="N" (11)
12. access="field|property|ClassName" (12)
13. optimistic-lock="true|false" (13)
14. mutable="true|false" (14)
15. >
16.
17.
18.

(1) name 集合属性的名称
(2) table (可选——默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用)
(3) schema (可选) 表的schema的名称, 他将覆盖在根元素中定义的schema
(4) lazy (可选--默认为true) 可以用来关闭延迟加载(false),
(5) inverse (可选——默认为false) 标记这个集合作为双向关联关系中的方向一端。
(6) cascade (可选——默认为none) 让操作级联到子实体
(7) sort(可选)指定集合的排序顺序
(8) order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序
(9) where (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用)
(10) fetch (可选, 默认为select) 用于在外连接抓取、通过后续select抓取和通过后续subselect抓取之间选择。
(11) batch-size (可选, 默认为1) 指定通过延迟加载取得集合实例的批处理块大小
(12) access(可选-默认为属性property):Hibernate取得集合属性值时使用的策略
(13) 乐观锁 (可选 - 默认为 true): 对集合的状态的改变会是否导致其所属的实体的版本增长。 (对一对多关联来说,关闭这个属性常常是有理的)
(14) mutable(可变) (可选 - 默认为true): 若值为false,表明集合中的元素不会改变(在某些情况下可以进行一些小的性能优化)。
集合外键
集合实例在数据库中依靠持有集合的实体的外键加以辨别。此外键作为集合关键字段加以引用。集合关键字段通过 元素映射。
在外键字段上可能具有非空约束。对于大多数集合来说,这是隐含的。对单向一对多关联来说,外键字段默认是可以为空的,因此你可能需要指明 not-null=“true”。示例如下:

java代码:
1.
外键约束可以使用 ON DELETE CASCADE,示例如下:

java代码:
1.
2. one-to-one
通过 one-to-one 元素,可以定义持久化类的一对一关联。

java代码:
1. 2. name="propertyName"(1)
3. class="ClassName"(2)
4. cascade="cascade_style"(3)
5. constrained="true|false"(4)
6. fetch="join|select"(5)
7. property-ref="propertyNameFromAssociatedClass"(6)
8. access="field|property|ClassName"(7)
9. formula="any SQL expression"(8)
10. lazy="proxy|no-proxy|false"(9)
11. entity-name="EntityName"(10)
12. />
(1)name:属性名。
(2)class(可选 — 默认是通过反射得到的属性类型):被关