多对一(many-to-one) .

通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。 这种关系模型是多对一关联(实际上是一个对象引用-译注):这个表的一个外键引用目标表的 主键字段。

<many-to-one name="propertyName" column="column_name" class="ClassName" cascade="cascade_style" fetch="join|select" update="true|false" insert="true|false" property-ref="propertyNameFromAssociatedClass" access="field|property|ClassName" unique="true|false" not-null="true|false" optimistic-lock="true|false" lazy="proxy|no-proxy|false" not-found="ignore|exception" entity-name="EntityName" formula="arbitrary SQL expression" node="element-name|@attribute-name|element/@attribute|." embed-xml="true|false" index="index_name" unique_key="unique_key_id" foreign-key="foreign_key_name" />

 

1

name: 属性名。

2

column (可选): 外间字段名。它也可以通过嵌套的<column>元素指定。

3

class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。

4

cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。

5

fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。

6

update, insert (可选 - 默认为true) 指定对应的字段是否包含在用于UPDATE 和/或INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序生成。

6

property-ref: (可选) 指定关联类的一个属性,这个属性将会和本类主键相对应。 如果没有指定,会使用对方关联类的主键。

7

access (可选 - 默认是 property): Hibernate用来访问属性的策略。

8

unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。

9

not-null (可选): 使用DDL为外键字段生成一个非空约束。

10

optimistic-lock (可选 - 默认为true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。

11

lazy (可选 - 默认为 proxy): 默认情况下,单点关联是经过代理的。lazy="no-proxy"指定此属性应该在实例变量第一次被访问时应该延迟抓取(fetche lazily)(需要运行时字节码的增强)。lazy="false"指定此关联总是被预先抓取。

12

not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将行数据不存在视为一个空(null)关联。

13

entity-name (可选): 被关联的类的实体名。

14

formula (可选): SQL表达式,用于定义computed(计算出的)外键值。

cascade属性设置为除了none以外任何有意义的值, 它将把特定的操作传递到关联对象中。这个值就代表着Hibernate基本操作的名称,persist, merge, delete, save-update, evict, replicate, lock, refresh, 以及特别的值delete-orphanall,并且可以用逗号分隔符 来组合这些操作,例如,cascade="persist,merge,evict"cascade="all,delete-orphan"。更全面的解释请参考第 10.11 节 “传播性持久化(transitive persistence)”. 注意,单值关联 (many-to-one 和 one-to-one 关联) 不支持删除孤儿(orphan delete,删除不再被引用的值).

一个典型的简单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 name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>
 
 
 
1.如表Class(ClassID,Class_No,ClassName)与Student(StudentID,studentName,Class_No), 
其中ClassID,studentID为主键 
两个表是一对多的关系,而要求两个通过ClassNo来关联.  
而一般的情况下是通过ClassID,放在student表中作为外键. 
2.具体的Hibernate的配置文件如下: 
Class.hbm.xml: 
  <property 
        name="classNo" 
        type="java.lang.String" 
        column="Class_No" 
        length="30" 
    /> 
    <!-- Associations --> 
      <set name="students" 
    lazy="false" 
    inverse="true" 
         cascade="all-delete-orphan" 
        > 

    <key column="Class_No"    property-ref="classNo"/> 
    
    <one-to-many 
            class="Student" 
        /> 
    </set> 


Student.hbm.xml: 

   <many-to-one 
        name="class" 
        class="Class" 
  not-null="true" 
  property-ref="classNo" 
    > 
        <column name="Class_No"      /> 
    </many-to-one> 

3.注意点: 
property-ref属性一般用来解决遗留数据库One To Many关系的问题 
property-ref(可选)被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键. 
property-ref=不是数据库表中的字段名,而是定义的java类中的属性性名,一定要注意.



 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值