当前位置:编程学习 > JAVA >>

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

数据表之间的关系分为三类:一对一、一对多、多对多
一对一数据表(部门表  和  部门主管表)
一对多数据表(部门表  和  部门下的人员表)
多对多数据表(部门表  和  人员表)
 

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

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<A> colA = null;  } 
10. n对象多对多 (双向) 
11. public class A { 
12. private Collection<B> colB = null;  } 
13. public class B { 
14. private Collection<A> colA = null;  } 
 
双向一对多是最常用的映射关系
<key>元素
<key> 元素在父映射元素定义了对新表的连接,并且在被连接表中定义了一个外键引用原表的主键的情况下经常使用。

java代码:
1. <key 
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(可选):外键字段的名称。也可以通过嵌套的 <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>元素用来映射Set类型的属性:

java代码:
1. <class name="Product"> 
2. <id name="serialNumber" column="productSerialNumber"/> 
3. <set name="parts"> 
4. <key column="productSerialNumber" not-null="true"/> 
5. <one-to-many class="Part"/> 
6. </set> 
7. </class> 
除了<set>,还有<list>, <map>, <bag>, <array> 和 <primitive-array> 映射元素。<map>具有代表性 ,如下:

java代码:
1. <map 
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. <key .... /> <map-key .... /> 
17. <element .... /> 
18. </map> 
(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,表明集合中的元素不会改变(在某些情况下可以进行一些小的性能优化)。
集合外键
集合实例在数据库中依靠持有集合的实体的外键加以辨别。此外键作为集合关键字段加以引用。集合关键字段通过 <key> 元素映射。
在外键字段上可能具有非空约束。对于大多数集合来说,这是隐含的。对单向一对多关联来说,外键字段默认是可以为空的,因此你可能需要指明 not-null=“true”。示例如下:

java代码:
1. <key column="productSerialNumber" not-null="true"/> 
外键约束可以使用 ON DELETE CASCADE,示例如下:

java代码:
1. <key column="productSerialNumber" on-delete="cascade"/> 
2. one-to-one 
通过 one-to-one 元素,可以定义持久化类的一对一关联。

java代码:
1. <one-to-one 
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(可选 — 默认是通过反射得到的属性类型):被关联的类的名字。
(3)cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象。
(4)constrained(约束)(可选)表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。这个选项影响 save() 和 delete() 在级联执行时的先后顺序以及决定该关联能否被委托(也在 schema export tool 中被使用)。
(5)fetch(可选 — 默认为 select):在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。
(6)property-ref:(可选)指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。
(7)access(可选 — 默认为 property):Hibernate 用来访问属性值的策略。
(8)formula (可选):绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中,你可能会指向其他的一个或多个字段,或者是一个表达式,这些情况下,你可以用一个 SQL 公式来表示。(可以在 org.hibernate.test.onetooneformula 找到例子)
(9)lazy(可选 — 默认为 proxy):默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 lazy="false"指定此

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,