many-to-one各属性含义

本文详细介绍了Hibernate中Many-to-One关联映射的概念及其配置参数,包括属性名、外键字段名、关联类名等,并提供了具体的示例。

转自http://blog.youkuaiyun.com/wangchangshuai0010/article/details/8921730

 

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

这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段。

<many-to-one

        name="propertyName"                                          <span class="co">(1)</span>


        column="column_name"                                         <span class="co">(2)</span>


        class="ClassName"                                            <span class="co">(3)</span>


        cascade="cascade_style"                                      <span class="co">(4)</span>


        fetch="join|select"                                          <span class="co">(5)</span>


        update="true|false"                                          <span class="co">(6)</span>


        insert="true|false"                                          <span class="co">(6)</span>


        property-ref="propertyNameFromAssociatedClass"               <span class="co">(7)</span>


        access="field|property|ClassName"                            <span class="co">(8)</span>


        unique="true|false"                                          <span class="co">(9)</span>


        not-null="true|false"                                        <span class="co">(10)</span>


        optimistic-lock="true|false"                                 <span class="co">(11)</span>


        lazy="true|proxy|false"                                      <span class="co">(12)</span>


        not-found="ignore|exception"                                 <span class="co">(13)</span>


        entity-name="EntityName"                                     <span class="co">(14)</span>


        node="element-name|@attribute-name|element/@attribute|."

       embed-xml="true|false"

/>
(1)name : 属性名。
(2)column   (可选): 外间字段名。它也可以通过嵌套的  <column> 元素指定。
(3)class   (可选 - 默认是通过反射得到属性类型): 关联的类的名字。
(4)cascade(级联)   (可选): 指明哪些操作会从父对象级联到关联的对象。
(5)fetch   (可选 - 默认为  select ): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。
(6)update, insert   (可选 - defaults to  true ) 指定对应的字段是否包含在用于UPDATE   和/或  INSERT   的SQL语句中。如果二者都是false ,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序。
(7)property-ref : (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。
(8)access   (可选 - 默认是  property ): Hibernate用来访问属性的策略。
(9)unique   (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref 的目标属性。这使关联同时具有 一对一的效果。
(10)not-null   (可选): 使用DDL为外键字段生成一个非空约束。
(11)optimistic-lock   (可选 - 默认为  true ): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
(12)lazy   (可选 - 默认为  proxy ): 默认情况下,单点关联是经过代理的。lazy="true" 指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。lazy="false" 指定此关联总是被预先抓取。
(13)not-found   (可选 - 默认为  exception ): 指定外键引用的数据不存在时如何处理:  ignore 会将数据不存在作为关联到一个空对象(null)处理。
(14)entity-name   (optional): 被关联的类的实体名。

cascade 属性设置为除了none 以外任何有意义的值, 它将把特定的操作传播到关联对象中。这个值就代表着Hibernate基本操作的名称,  persist, merge, delete, save-update, evict, replicate, lock, refresh , 以及特别的值delete-orphan 和all ,并且可以用逗号分隔符 来合并这些操作,例如,cascade="persist,merge,evict" 或  cascade="all,delete-orphan" 。

一个典型的简单many-to-one 定义例子:

<many-to-one name="product" class="Product" column="PRODUCT_ID"/>

property-ref 属性只应该用来对付老旧的数据库系统, 可能有外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况下。 这是一种十分丑陋的关系模型。比如说,假设Product 类有一个惟一的序列号, 它并不是主键。(unique 属性控制Hibernate通过SchemaExport工具生成DDL的过程。)

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>

那么关于OrderItem   的映射可能是:

<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>

当然,我们决不鼓励这种用法。

如果被引用的唯一主键由关联实体的多个属性组成,你应该在名称为<properties> 的元素 里面映射所有关联的属性。

`<many-to-one>` 是 Hibernate 中用于配置实体类之间 **多对一关联关系** 的映射标签。 --- ### ✅ 一、基本含义 - **“多对一”(many-to-one)** 表示:**多个实例对应一个目标实例**。 - 在数据库中,通常体现为:**外键字段存在于“多方”表中,指向“一方”表的主键。** --- ### ✅ 二、举例说明 比如: - 多个 `ErcProcessLog`(多方)记录可以对应一个 `ErcMastForm`(一方)记录。 - `ERC_PROCESS_LOG` 表中有一个外键字段 `erc_form_id`,指向 `ERC_MAST_FORM` 表的主键 `ID`。 这就构成了一个典型的 **多对一关系**。 --- ### ✅ 三、映射配置说明 你提供的配置如下: ```xml <many-to-one name="workflowEntry" class="ErcMastForm"> <column name="erc_form_id"/> </many-to-one> ``` | 属性 | 说明 | |------|------| | `name="workflowEntry"` | 实体类中的属性名,类型是 `ErcMastForm` | | `class="ErcMastForm"` | 关联的目标实体类 | | `<column name="erc_form_id"/>` | 数据库中对应的外键字段名 | --- ### ✅ 四、Java 实体类示例 ```java public class ErcProcessLog { private Long id; private ErcMastForm workflowEntry; // many-to-one 关联对象 // 其他字段... } ``` Hibernate 会自动根据 `erc_form_id` 字段加载对应的 `ErcMastForm` 实例。 --- ### ✅ 五、数据库结构示例 | ERC_PROCESS_LOG | ERC_MAST_FORM | |------------------|----------------| | ID | ID | | ERC_FORM_ID ➜ | FORM_NAME | | ... | ... | --- ### ✅ 六、使用场景 - 查询某个流程日志时,可以同时获取它关联的流程表单信息。 - 可以在 HQL 中直接访问关联对象的属性: ```java select epl.workflowEntry.formName from ErcProcessLog epl ... ``` --- ### ✅ 七、总结 > `<many-to-one>` 是 Hibernate 中用于表示 **多个对象对应一个对象** 的关系映射,通常用于配置外键关联,实现对象之间的关联查询和操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值