企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 5.1.11\. 一对一 持久化对象之间一对一的关联关系是通过`one-to-one`元素定义的。 ``` <one-to-one name="propertyName" class="ClassName" cascade="cascade_style" constrained="true|false" fetch="join|select" property-ref="propertyNameFromAssociatedClass" access="field|property|ClassName" formula="any SQL expression" lazy="proxy|no-proxy|false" entity-name="EntityName" node="element-name|@attribute-name|element/@attribute|." embed-xml="true|false" foreign-key="foreign_key_name" /> ``` | ![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png) | `name`: 属性的名字。 | |:--- |:--- | | ![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png) | `class` (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 | | ![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png) | `cascade(级联)` (可选) 表明操作是否从父对象级联到被关联的对象。 | | ![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png) | `constrained(约束)` (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响`save()`和`delete()`在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用). | | ![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png) | `fetch` (可选 - 默认设置为`选择`): 在外连接抓取或者序列选择抓取选择其一. | | ![6](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png) | `property-ref`: (可选) 指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。 | | ![7](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png) | `access` (可选 - 默认是 `property`): Hibernate用来访问属性的策略。 | | ![8](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png) | `formula` (可选):绝大多数一对一的关联都指向其实体的主键。在一些少见的情况中, 你可能会指向其他的一个或多个字段,或者是一个表达式,这些情况下,你可以用一个SQL公式来表示。 (可以在org.hibernate.test.onetooneformula找到例子) | | ![9](https://box.kancloud.cn/2016-01-06_568cdb4f68749.png) | `lazy` (可选 - 默认为 `proxy`): 默认情况下,单点关联是经过代理的。`lazy="no-proxy"`指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。 `lazy="false"`指定此关联总是被预先抓取。_注意,如果`constrained="false"`, 不可能使用代理,Hibernate会采取预先抓取!_ | | ![10](https://box.kancloud.cn/2016-01-06_568cdb4f83cf0.png) | `entity-name` (可选): 被关联的类的实体名。 | 有两种不同的一对一关联: * 主键关联 * 惟一外键关联 主键关联不需要额外的表字段;如果两行是通过这种一对一关系相关联的,那么这两行就共享同样的主关键字值。所以如果你希望两个对象通过主键一对一关联,你必须确认它们被赋予同样的标识值! 比如说,对下面的`Employee`和`Person`进行主键一对一关联: ``` <one-to-one name="person" class="Person"/> ``` ``` <one-to-one name="employee" class="Employee" constrained="true"/> ``` 现在我们必须确保PERSON和EMPLOYEE中相关的字段是相等的。我们使用一个被成为`foreign`的特殊的hibernate标识符生成策略: ``` <class name="person" table="PERSON"> <id name="id" column="PERSON_ID"> <generator class="foreign"> <param name="property">employee</param> </generator> </id> ... <one-to-one name="employee" class="Employee" constrained="true"/> </class> ``` 一个刚刚保存的`Person`实例被赋予和该`Person`的`employee`属性所指向的`Employee`实例同样的关键字值。 另一种方式是一个外键和一个惟一关键字对应,上面的`Employee`和`Person`的例子,如果使用这种关联方式,可以表达成: ``` <many-to-one name="person" class="Person" column="PERSON_ID" unique="true"/> ``` 如果在`Person`的映射加入下面几句,这种关联就是双向的: ``` <one-to-one name"employee" class="Employee" property-ref="person"/> ```