`
zhangfeiii
  • 浏览: 44606 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Hibernate学习笔记many-to-one/one-to-many/many-to-many(转)

阅读更多
many-to-one:描述多对一的一种数据模型,它指定many一方是不能独立存在的,我个人认为many-to-one是NHB中保证数据有效性的最有用的一种映射,通过使用many-to-one能有效的防治孤儿记录被写入到数据表中。在本文描述的例子中,Student类和Classes类之间是多对一关系.

  通过many-to-one元素,可以定义一种常见的与另一个持久化类的关联。这种关系模型是多对一关联。(实际上是一个对象引用。)在映射文件中用many-to-one标签描述此种关系. <many-to-one
        name="propertyName"(1)
        column="column_name"(2)
        class="ClassName"(3)
        cascade="all|none|save-update|delete"(4)
        outer-join="true|false|auto"(5)
        update="true|false"(6)
        insert="true|false"(7)
        property-ref="propertyNameFromAssociatedClass" (8)
        access="field|property|ClassName"(9)
        unique="true|false" (10)
/>
1.name:属性名。指出many一方的类用哪个属性和one一方的类关联.
2.column:字段名(可选).指出many一方的类对应的数据表用哪个列和one一方的类对应的数据表关联(两表之间存在外键关联);
3.class:关联的类的名字(可选 - 默认是通过反射得到属性类型);
4.cascade:指明哪些操作会从父对象级联到关联的对象(可选).cascade属性允许下列值:: all, save-update, delete, none. 设置除了none以外的其它值会传播特定的操作到关联的(子)对象中。
5.outer-join:当设置hibernate.use_outer_join的时候,对这个关联允许外连接抓取(可选 - 默认为 auto).outer-join参数允许下列三个不同值: auto(使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy) ),true(一直使用外连接来抓取关联),false(永远不使用外连接来抓取关联);
6.update,insert:指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到的,或者通过trigger(除法器),或者是其他程序(可选 - 默认为 true)
7.property-ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键(可选).property-ref属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号,它并不是主键;
8.access:NHibernate 用来访问属性的策略(可选 - 默认为property)
9.unique:允许产生外键列唯一约束的数据库定义语言(DDL)(可选)

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

<many-to-one name="Classes" column="cID" unique ="true"/>
只要在原Student.hbm.xml映射文件中添加many-to-one标签就可以了.

对于Sturent类得添加一个属性Classes:Classes

one-to-many:一对多也是一种常见的数据模型,在按范式设计的数据库中随处可见。在NHB中通过one-to-many可以非常方便的处理这种模型,同时NHB还提供了级联更新和删除的功能,以保证数据完整性。在本文描述的例子中,Classes类和Student类是一对多的关系.

Classes类的映射文件:Classes.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="NHibernateTest.Classes,NHibernateTest" table="Classes">
    <id name="ClassesID" column="ID" type="Int32" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="ClassesName" column="ClassName" type="String" length="50"/>

    <bag name="StudentList" cascade="all"  inverse="true">
      <key column="ID" />
      <one-to-many class="NHibernateTest.Student,NHibernateTest" />
    </bag>
  </class>
</hibernate-mapping>
  如映射文件所示,one-to-many标签必须包含在标签bag中(个人理解:多嘛,就用一个包装起来~)
        bag标签的name属性指出Address对象用哪个属性和Student对象关联,inverse属性使collection不更新连接(总之,这个属性提高了性能,具体的情况请参考NHibernate的帮助文档).
  key标签的column属性指出了Address对象对应的数据表用哪个字段和Student对象对应的数据表关联
  one-to-many标签的class属性指出了Address和哪个对象关联.

对于Classes类得创建一个StudentList : Student的属性,用来描述与Student对象的关系.

many-to-many:多对多在数据库中也是常见的数据模型,像用户与组,用户与权限等。多对多关系需要通过一个中间表实现,element的就是读取这个中间表中某列的值。在本文的例子中,Student类和Subject类是多对多的关系.

  Student的映射可能是:

    <bag name="SubjectList" table="r_Student_Subject" inverse="true" cascade="save-update" lazy="false">
      <key column="StudentID" />
      <many-to-many class="NHibernateTest.Subject,NHibernateTest" column="ID" outer-join="auto" />
    </bag>
  在bag标签中,加入了一个table属性,它指定一个实现多对多的中间表

  完整的Student.hbm.xml源码如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
  <class name="NHibernateTest.Student,NHibernateTest" table="Users">
    <id name="UserID" column="ID" type="Int32" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="UserName" column="UserName" type="String" length="20"/>
    <property name="Password" column="Password" type="String" length="20"/>

    <!--Student类和NativePlace类是一对一的关系-->
    <one-to-one name="NativePlace" class="NHibernateTest.NativePlace,NHibernateTest" cascade="all" />

    <!--Student类和Classes类是多对一的关系-->
    <many-to-one name="Classes" column="cID" unique ="true"/>

    <!--Student类和Address类是一对多的关系-->
    <bag name="AddressList" cascade="all"  inverse="true">
      <key column="ID" />
      <one-to-many class="NHibernateTest.Address,NHibernateTest" />
    </bag>

    <!--Student类和Subject类是多对多的关系-->
    <bag name="SubjectList" table="r_Student_Subject" inverse="true" cascade="save-update" lazy="false">
      <key column="StudentID" />
      <many-to-many class="NHibernateTest.Subject,NHibernateTest" column="ID" outer-join="auto" />
    </bag>
  </class>
</hibernate-mapping>

  Student类得添加类型为IList的属性SubjectList表示与类Subject的关系.

  由于Student的映射关系比较复杂,本文就再熬述它的CRUD操作

0 0 0
(请您对文章做出评价)
分享到:
评论

相关推荐

    hibernate 学习笔记小结

    ### Hibernate学习笔记小结 #### 一、简介与配置 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它允许开发人员将Java对象自动持久化到数据库表中,从而简化了数据访问层的开发工作。在Spring框架中,...

    hibernate学习笔记文档

    - 在 XML 映射文件中使用 `&lt;one-to-many&gt;` 或 `&lt;many-to-many&gt;` 标签来配置这些关系。 - **查询操作**: - 使用 HQL(Hibernate Query Language)或 Criteria API 来执行复杂查询。 - 支持分页查询、动态查询等...

    Hibernate学习笔记_songjignhao_1

    在 Hibernate 映射文件中,我们使用 `&lt;set&gt;` 标签来定义集合关系,`&lt;one-to-many&gt;` 标签表示从 Customer 到 Order 的关系,而 `&lt;many-to-one&gt;` 标签则表示从 Order 到 Customer 的关系。注意设置 cascade 参数以处理...

    达内HIBERNATE学习笔记

    - `&lt;one-to-one&gt;`、`&lt;one-to-many&gt;`、`&lt;many-to-many&gt;`:表示关联关系的映射。 #### 2.3 id的内置生成器 - **常见生成器**: - `increment`:每次生成一个递增的值。 - `identity`:由数据库自动生成唯一标识符...

    hibernate 学习笔记4

    ### Hibernate 学习笔记4 —— 多对多关系与多态映射 #### 多对多关系 在 Hibernate 中处理多对多关系时,通常采用一种称为“连接表”或“关联表”的方法来实现两个实体之间的多对多关联。这种设计方式较为常见且...

    Hibernate学习笔记,使用Hibernate做数据层非常方便

    【Hibernate学习笔记,使用Hibernate做数据层非常方便】 在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了数据库操作,将数据库中的表映射为Java对象,使得开发者可以像...

    hibernate 学习笔记3

    标题:Hibernate学习笔记3 描述:本篇笔记深入探讨了Hibernate框架中一对多关系的映射及持久化对象状态管理,结合个人理解与实践经验,旨在为读者提供一份详实的学习资料。 ### 一、一对多关系映射详解 在...

    Hibernate笔记

    &lt;many-to-one name="classes" column="classesid" fetch="select"/&gt; ``` - **Fetch="join"**: 指定使用`JOIN FETCH`策略,即在加载主对象的同时,通过`JOIN`语句一次性加载关联对象。这可以减少数据库查询次数,但...

Global site tag (gtag.js) - Google Analytics