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

2014-11-24 08:26:58 · 作者: · 浏览: 5
联的类的名字。
(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"指定此关联总是被预先抓取。注意,如果constrained="false", 不可能使用代理,Hibernate会采取预先抓取。
(10)entity-name(可选):被关联的类的实体名。
nmany-to-one
通过 many-to-one 元素,可以定义一种常见的与另一个持久化类的多对一关联,这个表的一个外键引用目标表的主键字段。

java代码:
1. 2. name="propertyName" (1)
3. column="column_name" (2)
4. class="ClassName" (3)
5. cascade="cascade_style"(4)
6. fetch="join|select" (5)
7. update="true|false" (6)
8. insert="true|false" (7)
9. property-ref="propertyNameFromAssociatedClass"(8)
10. access="field|property|ClassName"(9)
11. unique="true|false" (10)
12. not-null="true|false" (11)
13. optimistic-lock="true|false“ (12)
14. lazy="proxy|no-proxy|false" (13)
15. not-found="ignore|exception“ (14)
16. entity-name="EntityName" (15)
17. formula="arbitrary SQL expression"(16)
18. />
19.
(1)name:属性名。
(2)column(可选):外键字段的名称。也可以通过嵌套的 指定。
(3)class(可选 — 默认是通过反射得到的属性类型):被关联的类的名字。
(4)cascade(级联)(可选)表明操作是否从父对象级联到被关联的对象。
(5)fetch(可选 — 默认为 select):在外连接抓取和序列选择抓取两者中选择其一。
(6)update, insert(可选 — 默认为 true)指定对应的字段是否包含在用于 UPDATE 和/或 INSERT的 SQL 语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过
映射到同一个(或多个)字段的某些其他属性得到 或者通过 trigger(触发器)、或其他程序生成。
(7)property-ref:(可选)被关联到此外键的类中的对应属性的名字。如果不指定,使用被关联类的主键
(8)access(可选 — 默认为 property):Hibernate 用来访问属性值的策略。
(9)unique(可选):使用 DDL 为外键字段生成一个唯一约束。此外, 这也可以用作 propertyref的目标属性。这使关联同时具有一对一的效果。

(10)not-null(可选):使用 DDL 为外键字段生成一个非空约束。
(11)optimistic-lock(可选 — 默认为 true):指定这个属性在做更新时是否需要获得乐观锁定。换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
(12)lazy(可选 — 默认为 proxy):默认情况下,单点关联是经过代理的。lazy="no-proxy" 指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。lazy="false" 指定此关联总是被预先抓取。
(13)not-found(可选 - 默认为exception):指定如何处理引用缺失行的外键:ignore 会把缺失的行作为一个空关联处理。
(14)entity-name(可选):被关联的类的实体名。
(15)formula(可选):SQL 表达式,用于定义 computed(计算出的)外键值。

one-to-many
通过 one-to-many 元素,可以定义一种常见的与另一个持久化类的一对多关联。

java代码:
1. 2. class="ClassName"(1)
3. not-found="ignore|exception"(2)
4. entity-name="EntityName"(3)
5. />
(1)class(必需):被关联类的名称。

(2)not-found(可选 - 默认为exception):指明若缓存的标示值关联的行缺失,该如何处理:ignore 会把缺失的行作为一个空关联处理。

(3)entity-name(可选):被关联的类的实体名,作为 class 的替代。

注意: 元素不需要定义任何字段。也不需要指定表名。
还是用示例来看,下面作一个双向一对多的关系示例:
1:新建一个Parent对象和Child对象,Parent对象里面有一个Child对象的集合,Child对象里面有一个对Parent对象的引用,如下:

java代码:
1. public class Parent{
2. private String id;
3. private String name;
4. private Set children = new HashSet();
5. ……
6. }
7. public class Child {
8. private String uuid;
9. private String address;
10. private String postCode;
11. private Parent parent;
12. ……
13. }
14. Parent.hbm.xml:
15. < xml version="1.0" encoding="UTF-8" >
16. 17. "-//Hibernate/Hibernate Mapping DTD 3.0//EN