`
yunhuisdu19811011
  • 浏览: 96664 次
  • 性别: Icon_minigender_2
  • 来自: 济南
社区版块
存档分类
最新评论
  • fightingIOW: 案例看了,能实现上传,但是不是异步的,怎么改成页面可以预览呢? ...
    swfUpload实例
  • kizz: 您好,实例我看了,确实不错。您有struts2版的吗?现在项目 ...
    swfUpload实例

Hibernate关系映射(N--1和 1--N)多对一和一对多

    博客分类:
  • java
阅读更多

注意 :尽量使用多对一,一对多关系效率有些慢

 

(1)N--1(单向N--1外键映射) 只要是外键,就会牵扯到多对一的关系

第一步:类、对象之间的关系映射

public class Room {
    private int id;
    private String roomName;  
}

 

public class User {
    private int id;
    private String truename;
     private Room room; 

}

 

第二步:xml之间的映射

    <class name="Room" table="t_room">
        <id name="id" column="room_id">
            <generator class="native"></generator>
        </id>
        <property name="roomName" unique="true" not-null="true" column="room_name" length="32"/>
    </class>

 

<class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="truename" unique="true" not-null="true" column="truename" length="32"/>
        
        <many-to-one name="room" not-null="true" class="Room" column="room_id" --外键

            cascade="save-update">    --保存修改级联

        </many-to-one>
    </class>

 

第三步:创建对象

        Room room = new Room();
         room.setRoomName("听雨轩");
          
            User u1 = new User();
            u1.setTruename("张三");
            u1.setRoom(room);
           
            User u2 = new User();
            u2.setTruename("李四");
            u2.setRoom(room);
           
            session.save(u1);
            session.save(u2);

 

 

第四步:查询

        User user= (User )session.load(User .class, 1);

        Room room = user.getRoom();

        System.out.println(user.getTruename());

        System.out.println(room .getRoomName());

 

 

(2)N--1(双向N--1) 数据库和(1)中的相同

 

第一步:类、对象之间的关系映射

public class Room {
    private int id;
    private String roomName;  

    private Set<User> users;  // 增加了user集合 但是数据库没有变化
}

 

public class User {
    private int id;
    private String truename;
     private Room room; 

}

 

第二步:xml之间的映射

    <class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native">               
            </generator>
        </id>
       
        <property name="truename" unique="true" not-null="true" column="truename" length="32"/>
           
        <many-to-one name="room" not-null="true" class="Room" column="room_id"

         cascade="save-update"></many-to-one>
      </class>

 

 

    <class name="Room" table="t_room">
        <id name="id" column="room_id">
            <generator class="native"></generator>
        </id>
   
    property name="roomName" unique="true" not-null="true" column="room_name" length="32"/>
        --增加了set的配置
        <set name="users">
            <key column="room_id"></key>  --参考user中room_id字段
            <one-to-many class="User"/>
        </set>   

    </class>

 

 

第三步:创建对象 和(1)中的一致

        Room room = new Room();
         room.setRoomName("听雨轩");
          
            User u1 = new User();
            u1.setTruename("张三");
            u1.setRoom(room);
           
            User u2 = new User();
            u2.setTruename("李四");
            u2.setRoom(room);
           
            session.save(u1);
            session.save(u2);

 

第四步:查询

        Room room = (Room)session.load(Room.class, 1);
            System.out.println(room.getRoomName());
            Set<User> users = room.getUsers();
           
            for(User user : users){
                System.out.println(user.getTruename());
            }

 

 

(3)1--N(单向一对多映射) 数据库中表的设计和(2)中表设计一致

第一步:对象关系的映射

public class Room {
    private int id;
    private String roomName;
    private Set<User> users;  // 1的一端,加上多的引用

 }

 

public class User {
    private int id;
    private String truename; //  没有对1的一端的引用
  }

 

第二步:xml的配置

    <class name="User" table="t_user">
        <id name="id" column="id">
            <generator class="native">               
            </generator>
        </id>
       
        <property name="truename" unique="true" not-null="true" column="truename" length="32"/>

     </class>

 

 

<class name="Room" table="t_room">
        <id name="id" column="room_id">
            <generator class="native"></generator>
        </id>
       
        <property name="roomName" unique="true" not-null="true" column="room_name" length="32"/>
       
        <set name="users" cascade="save-update"

              inverse="true">    ---反转,将主控关系交给对方来管理 (默认是false,代表由本身来维护
            <key column="room_id"></key>
            <one-to-many class="User"/>
        </set>

       
    </class>

 

 

  在N--1或者1--N双向关系维护(创建对象时候),强制交给多的一方进行维护,不让1的一方维护,这样能提高效率 , 减少了n条update语句,但是,在查询的时候, 在1的一方就不能查询关联数据了

 

  注意 :尽量使用多对一,一对多关系效率有些慢

 

 

分享到:
评论

相关推荐

    hibernateORM1-n映射

    总结来说,"hibernateORM1-n映射"是关于如何在Hibernate框架下建立和管理数据库中一对多关系的知识。理解和熟练运用这一映射机制,将有助于提高Java应用的数据库操作效率,减少代码量,增强程序的可维护性。通过正确...

    hibernate的多种映射关系

    Hibernate 支持多种集合类型,如 List、Set、Map 等,它们可以作为一对多或多对多关系的容器。`@ElementCollection` 用于映射非实体类属性的集合,而 `@OrderColumn` 可以指定集合元素的排序方式。 6. **级联操作 ...

    Hibernate的N对N的关系映射

    在关系型数据库设计中,实体之间的关联关系主要有三种类型:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)。而Hibernate作为一种流行的Java持久层框架,它能够帮助我们更好地管理和操作...

    hibernate(多对多关系映射)

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...

    hibernate-core-5.0.11.Final.jar

    Hibernate,作为Java领域中最著名的对象关系映射(ORM)框架之一,极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。本文将重点探讨`hibernate-core-5.0.11.Final.jar`的核心源码,帮助读者深入...

    hibernate-release-5.0.0.Final(1).zip

    本次我们将深入探讨的版本是`hibernate-release-5.0.0.Final(1)`,这个版本在Hibernate的生命周期中具有重要的地位,它引入了多项新特性和改进,旨在提升开发效率和性能。 一、Hibernate概述 Hibernate是Java领域中...

    Hibernate映射关系一对多

    通过上述讲解,我们了解了如何在Hibernate中配置和使用一对多映射关系,包括XML映射、注解映射、懒加载、级联操作以及实际应用中的注意事项。希望这些知识能帮助你更好地理解和运用Hibernate进行数据持久化。

    hibernate 全面学习->hibernate 关联映射学习

    `hibernate_one2many_1`和`hibernate_one2many_2`的示例可能分别展示了单向和双向的一对多映射。单向映射意味着只有父类知道子类的存在,而双向则允许双方相互引用。在配置中,这通常涉及到`@OneToMany`注解的使用,...

    hibernate-3.2(1)hibernate-3.2(1)

    - ** associations**:支持一对一、一对多、多对一、多对多等关系的映射。 3. **实际应用** - **实体类设计**:根据业务需求定义实体类,并使用Hibernate注解进行映射。 - **配置文件设置**:配置数据库连接、...

    10 映射-- 多对多(老师与学生)

    正确理解和使用Hibernate的多对多映射机制,能帮助我们更高效地构建和维护复杂的数据关系。同时,对源码的学习和工具的运用,也有助于提升我们对ORM框架的掌握程度,从而更好地服务于软件开发工作。

    Hibernate映射关系大全

    3. **无连接表的 1:N (一对多) 单向关联** 在单向关联中,一个实体(如 Dept)可以拥有多个实体(如 Emp)。配置 `&lt;set&gt;` 标签在一对一端(Dept),指定键列(deptid)和子类(Emp)。 4. **有连接表的 1:N 单向...

    Hibernate继承关系映射.pdf

    在Hibernate中,多态查询主要依赖于单表映射策略,因为它通过一个共享的表和识别字段实现了对继承结构的支持,从而允许使用更灵活和通用的查询语句。 总结,Hibernate提供了丰富的工具和策略来处理继承关系的映射,...

    hibernate-orm-master.zip

    Hibernate支持多种关联映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。这些关联可以通过定义外键或使用中间表来实现,使得对象间的复杂关系得以轻松处理。 ...

    hibernate多对一映射(XML)版

    - 在`Class`类中,由于是一对多的关系,所以不需要特殊的注解。 2. **XML映射文件**: - 对于`Student`实体,我们需要在对应的`.hbm.xml`文件中定义多对一的关系。使用`&lt;many-to-one&gt;`标签,指定关联的实体类和...

    hibernate 多对一映射

    【hibernate 多对一映射】是关系数据库与对象模型之间的一种映射机制,是Hibernate框架中的一个重要概念。Hibernate作为一个优秀的Java持久化框架,它允许开发者将数据库操作转化为面向对象的操作,大大简化了数据库...

    hibernate关系映射

    本主题主要探讨了四种基本的关系映射类型:多对多、一对多、多对一以及一对一。 **一、多对多关系映射** 在数据库中,多对多关系意味着一个实体可以与多个其他实体相关联,反之亦然。在Hibernate中,这种关系通过`...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    - **一对多(OneToMany)**: 一个实体类实例对应数据库表的多行记录。 - **多对一(ManyToOne)**: 多行记录对应数据库表的一个实体类实例。 - **多对多(ManyToMany)**: 多行记录对应数据库表的多个实体类实例。 ...

    hibernate-jpa-2.1-api 1.0.0.Final API

    6. **关系映射**:包括一对一、一对多、多对一和多对多的关系,使用@OneToOne, @OneToMany, @ManyToOne 和 @ManyToMany 注解来定义。 7. **懒加载(Lazy Loading)**:一种优化策略,关联的对象在需要时才从数据库...

    Hibernate part 8:一对多关联关系映射

    在提供的链接中,可以找到更多关于Hibernate一对多关联的实例和详细解释,包括如何在XML映射文件中配置这些关系。通过深入学习和实践,开发者能够熟练地在项目中运用Hibernate的一对多关联,提高开发效率和代码质量...

    hibernate-release-5.2.10

    九、多对一、一对多、多对多关系 Hibernate通过外键映射和集合映射处理这些关系,如@ManyToOne、@OneToMany、@ManyToMany等。 十、 Hibenate事件监听器 通过实现特定接口,如PreInsertEventListener,可以定制在...

Global site tag (gtag.js) - Google Analytics