`
younglibin
  • 浏览: 1214103 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate映射文件one-to-many元素属性

阅读更多

单向1——N关联关系的持久化类发生了改变,持久化类里需要使用集合,因为1的一端需要访问N的一端,而N的一端降一级和的形式出现:它只是将前边的用于集合映射的<element.../>元素改为<one-to-many.../>

 

属性:

  1. class:指定关联的实体类
  2. not-found:改属性只能是exception或ignore,指定当从记录参照的主表记录不存在时,hibernate如何处理;默认exception

 

单向的1——N关联关系:

只需要在1的实体类一端增加Set属性的setter,getter;

 

无连接表的单向1——N:

eg:

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->

  <set name="addresses">
   <!-- 指定关联的外键列 -->
   <key column="personId"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>

  </set>

 

有连接表的单向一对多:

对于有连接表的1——N,不是使用哪个one-to-many 而是使用many-to-many 为了保证当前实体的是 1 的一端,因此要用unique=“true”

     关于many-to-many 属性请参照连接

 

eg:

<!-- 映射集合属性,集合元素是其他持久化实体
   指定连接表的表名-->
  <set name="addresses" table="person_address">
   <!-- 指定连接表中参照本表记录的外键列名 -->
   <key column="person_id" />
    <!-- 使用many-to-many来映射1-N关联,
    增加unique="true" -->

   <many-to-many class="Address"
    unique="true"/>
  </set>

 

双向1——N关联:

 

对于1——N关联,hibernate推荐使用双向关联,而且不要让1的一端控制关联,使用N的一端控制关联关系;

双向的1——N和N——1是完全相同的两种形式;

 

两端都需要增加对关联属性的访问:

  • N的一端增加引用到关联实体的属性;
  • 1的一端增加集合属性;集合元素为关联实体;

eg:

Preson.java

 

//1-N关联关系,使用Set来保存关联实体
 private Set<Address> addresses
  = new HashSet<Address>();

 

Address.java

 

//保留关联实体的person属性

private Person person;

 

Preson.hbm.xml

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->
  <set name="addresses" inverse="true">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>
  </set>

 

Address.hbm.xml

<!-- 使用many-to-one映射N-1关联实体 -->
  <many-to-one name="person"
   column="person_id" not-null="true"/>

 

 

无连接表的双向1——N关联:

  1. N:的一端要增加<many-to-one......./>元素来影射关联属性;
  2. 1:的一端则需要使用<set../>或<bag../>元素来影射关联属性;在<set.../>或<bag.../>元素里需要增加<key.../>子元素映射外键列,并使用<one-to-many.../>子元素影射关联属性;

底层数据库记录了这种1——N关联关系,实际上只需要在N的一端的数据表里增加一个外键列即可,

这里存在一个问题:

     双向映射时<many-to-one.../>元素将用到外键列,

    <set.../>元素里的<key.../>子元素也用来映射外键列;

    其他的都映射在同一列,所以映射文件应该为这两个元素指定的column属性,并让两个column属性值相同;

   通常在多的一端控制关联关系,我们在<set.../>元素中设置  inverse=”true“

 

eg:

Preson.hbm.xml:
<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->
  <set name="addresses" inverse="true">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <one-to-many class="Address"/>
  </set>

Address.hbm.xml:
<!-- 使用many-to-one映射N-1关联实体 -->
  <many-to-one name="person"
   column="person_id" not-null="true"/>

 

有连接表的双向1——N关联:

 

有连接表的1——N关联类似于N——N关联

  1. 1:的一端使用集合元素,然后在集合元素中添加<many-to-many../>子元素,盖子元素映射到关联表在<many-to-many../>中使用unique=”true“ ,在set元素里使用key和many-to-many两个元素,他们也映射连接表的两个列;
  2. N:的一端则使用<join ../>元素来强制使用连接表,使用key子元素来影射连接表中的外键,使用many-to-one来映射连接表中的关联实体的外键列;

      保证join中的key子元素的column属性和set里many-to-many元素的column属性相同;

      join里的many-to-one子元素的column属性和set里的key元素的column属性相同;

    两端指定的连接表的Table属性不能省略,且属性值必须相同

 

eg:

Preson.hbm.xml:

<!-- 映射集合属性,集合元素是其他持久化实体
   没有指定cascade属性 -->

  <set name="addresses" inverse="true"
   table="person_address">
   <!-- 指定关联的外键列 -->
   <key column="person_id"/>
   <!-- 用以映射到关联类属性 -->
   <many-to-many class="Address"
    column="address_id" unique="true"/>

  </set>

 

 

Address.hbm.xml:

<!-- 显式使用join元素确定连接表 -->
  <join table="person_address">
   <!-- key映射外键列 -->
   <key column="address_id"/>
   <!-- 使用many-to-one映射N-1关联实体 -->
   <many-to-one name="person"
    column="person_id" not-null="true"/>

  </join>

 

1
0
分享到:
评论

相关推荐

    hibernate学习5之one-to-many双向关联.docx

    在XML映射文件中,`Student.hbm.xml`包含了`&lt;many-to-one&gt;`元素,表示学生对象引用了一个班级对象,通过`classesid`列连接。而`Classes.hbm.xml`则使用了`&lt;set&gt;`和`&lt;one-to-many&gt;`元素,表示班级对象包含一个学生...

    Hibernate one-to-many-annotation

    在Hibernate中,`one-to-many`关系是常见的实体间关系之一,表示一个实体可以与多个其他实体相关联。本文将深入探讨`Hibernate one-to-many`注解的使用和实现细节。 ### 一、`@OneToMany`注解概述 `@OneToMany`...

    Hibernate-one-to-many

    本文将深入探讨Hibernate中一对多(One-to-Many)关系的处理方式,特别是通过外键映射和inverse属性的应用场景。 #### 一对多关系概念 一对多关系在数据库设计中非常常见,它指的是一个实体可以与多个其他实体关联...

    NHibernate One-to-Many一对多映射-xxlinux_com

    `&lt;one-to-many&gt;`元素指定了子实体的类型。 在C#代码中,`User`类会有一个`Orders`属性,它是`Order`类型的集合: ```csharp public class User { public virtual int Id { get; set; } // ...其他属性... ...

    hibernate中one2many映射

    在Java的持久化框架Hibernate...综上所述,Hibernate中的One-to-Many映射涉及了映射文件的编写、Domain对象的设计、数据库配置以及CRUD操作。理解并熟练掌握这些内容,将有助于你在实际项目中高效地处理多对一的关系。

    Hibernate实现many-to-many的映射关系

    3. 在对应的映射文件中,使用`&lt;set&gt;`和`&lt;one-to-many&gt;`或`&lt;many-to-one&gt;`元素配置映射关系。 4. 如有必要,可以考虑将多对多关系转换为一对多,以优化性能和操作性。 理解并熟练掌握这些概念和实践,将有助于在使用...

    Hibernate映射笔记

    - `&lt;one-to-one&gt;`、`&lt;many-to-one&gt;`、`&lt;one-to-many&gt;`和`&lt;many-to-many&gt;`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`&lt;class&gt;`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...

    Hibernate 映射文件 结构

    5. **&lt;many-to-one&gt;**:一对多关系映射,表示一个实体类的某个属性引用了另一个实体类的一个实例。 6. **&lt;one-to-many&gt;**:多对一关系映射,与`&lt;many-to-one&gt;`相反,表示一个实体类的一组实例引用了另一个实体类的...

    Hibernate配置文件中映射元素详解

    - **一对一映射**:使用`&lt;many-to-one&gt;`元素表示,如`&lt;many-to-one name="friend" column="friend_id" update="false"/&gt;`。 - **一对多映射**:使用`&lt;set&gt;`元素配合`&lt;one-to-many&gt;`元素表示,例如: ```xml ...

    hiberate映射详解

    使用 `many-to-one` 元素在子类中定义对父类的引用,同时在父类中使用 `one-to-many` 元素声明子类的集合。外键通常位于子类的表中。例如,一个部门可以有多名员工,部门类可以定义一个 Employee 集合。 3. **多对...

    hibernate_6映射关系之one2many.zip_hibernate

    在Java的持久化框架Hibernate中,`One-to-Many`映射关系是对象关系映射(ORM)中常见的一种关联类型。它表示一个实体("One"端)与多个其他实体("Many"端)之间的关系。例如,一个学生可以有多个课程,一个老师可以...

    hibernate many to one

    在Java的持久化框架Hibernate中,"Many-to-One"关系是一种常见的关联映射类型,它表示一个实体(类)可以与多个其他实体实例相关联。在这个主题中,我们将深入探讨Hibernate如何处理这种关系,以及如何在实际编程中...

    hibernate 关联映射(一) many to one

    总结一下,Hibernate中的Many to One关联映射涉及实体类的设计、注解的使用以及映射文件的配置。正确地设置这些可以使得Java对象和数据库之间的交互变得简单而高效。在实际项目中,理解并熟练掌握这种映射方式对于...

    Hibernate关系映射 收藏

    在Java类中,双方都可以拥有对方的引用,而在映射文件中,使用`one-to-one`元素: ```xml &lt;one-to-one name="idCard" class="cn.jjm.hibernate.IdCard" unique="true" cascade="all"/&gt; ``` 这表示`Person`类的`...

    hibernate-one-to-many-uni

    【标题】"hibernate-one-to-many-uni" 指的是在Hibernate框架下实现的一对多单向关联关系。Hibernate是Java开发中常用的持久化框架,它简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。在这个...

    Hibernate映射配置实例大全(详细总结)

    例如,我们可以用`&lt;id&gt;`标签来标识主键,`&lt;property&gt;`标签映射普通字段,而`&lt;one-to-one&gt;`, `&lt;many-to-one&gt;`, `&lt;one-to-many&gt;`, 和 `&lt;many-to-many&gt;`则用于描述关联关系。 进一步,Hibernate提供了注解方式进行映射...

    Hibernate映射

    可以使用`@OneToOne`注解或在XML文件中定义`one-to-one`元素来实现。 **四、一对多(One-to-Many)映射** 在实体类中,使用`@OneToMany`注解或者在XML中配置`bag`、`list`、`set`等集合类型来表示一对多关系。可以...

    Hibernate关联映射

    这种关联可以通过在 `many-to-one` 元素中添加 `unique="true"` 属性实现。例如,在 Person 类中,有一个 Address 的属性,通过外键 `addressId` 与 Address 表关联,并设置 `unique="true"`,使得 Address 对象只能...

    hibernate5.2版本配置和映射dtd文件

    5. `&lt;one-to-one&gt;`, `&lt;many-to-one&gt;`, `&lt;one-to-many&gt;`, `&lt;many-to-many&gt;`:定义不同类型的关联关系。 例如: ```xml &lt;hibernate-mapping package="com.example"&gt; ... &lt;many-to-one name="department...

    Hibernate的配置详解

    在映射文件中,使用`one-to-one`元素定义这种关系,指定对方实体的类名和属性名。 2. 一对多关系(One-to-Many): - 一个实体对象可以对应多个其他实体对象的实例,通常在多方的一端使用`List`或`Set`来存储关联...

Global site tag (gtag.js) - Google Analytics