`
ningbingjian
  • 浏览: 9474 次
社区版块
存档分类
最新评论

06_多对一关联映射[转]

 
阅读更多
  多对一的例子 , 多个员工 对 一个部门





package dao.po;   
/**  
 * @author zl 员工类  
 */  
public class Employee   
{   
 private int   id; // 员工的ID    
 private String  name; // 员工的名称   
 private Department depart;    //员工所在部门, 是多对一关系  




package dao.po;   
/**  
 
 * 部门类  
 *   
 * @author zl  
 *   
 */  
public class Department   
{   
    private int     id; //部门的ID    
    private String  name;   //部门的名称   
}

  




映射文件 :


<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping    
    package="dao.po">  
    <class name="Employee">      
        <id name="id">  
            <generator class="native"/>  
        </id>  
        <property name="name" not-null="true" length="255" column="`name`"/>  
        <!-- 这里做多对一映射    -->  
        <!-- name="depart"是Employee类的属性名 -->  
        <!-- column="depart_id" 是表中字段名 -->  
        <!-- 注意:下面没有非空 约束 , 很多情况,外键是有非空约束的, 一会后面说-->  
        <!--column="depart_id" 中的depart_id是Employee对象的depart属性映射为Employee表中的depart_id字段-->  
        <many-to-one name="depart" column="depart_id" ></many-to-one>  
    </class>  
</hibernate-mapping> 

 

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC    
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping    
    package="dao.po">  
    <class name="Department">    
        <id name="id">  
            <generator class="native"/>  
        </id>        
        <property name="name" not-null="true" length="255" column="`name`"/>  
  
</class>  
</hibernate-mapping>  



保存员工 和 部门: 

 注意:保存的顺序: 

 

第一种: 

            session.save(depart); //先插入部门
            session.save(em1); //后插入员工, 因为员工的外键是 部门
            session.save(em2);

输出的SQL:

            Hibernate: insert into Department (`name`) values (?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)


第二种: 

            session.save(em1); //先插入员工
            session.save(em2);
            session.save(depart); //后插入部门

输出的SQL:

            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Employee (`name`, depart_id) values (?, ?)
            Hibernate: insert into Department (`name`) values (?)
            Hibernate: update Employee set `name`=?, depart_id=? where id=?
            Hibernate: update Employee set `name`=?, depart_id=? where id=?

 

            这里多了两句 update,要 注意.

 

如果Employee.hbm.xml 中外键有非空约束 ,如下:保存时只能用"第一种 "顺序.  用了第二种,先插入员工,但depart_id字段为空,会异常,不能插入.



<many-to-one name="depart" column="depart_id" not-null="true"></many-to-one>  




查询一个员工, 注意"部门": 





/**  
     * 测试查询  
     *   
     * @param args  
     */  
    public static void main(final String[] args)   
    {   
        //add(); //添加两个员工, 一个部门   
        final Employee em = query(7);   
        //员工的部门 , 执行Hibernate.initialize()后, 在session关闭前就取得了部门.   
        //若没有执行Hibernate.initialize(), 下面会抛异常.   
        System.out.println(em.getDepart().getName());   
}   
  
    /**  
     * 查询一个员工出来  
           */  
    public static Employee query(final int id)   
    {   
        Session session = null;   
        try  
        {   
            session = HibernateUtil.getSeesion();   
            final Transaction tx = session.beginTransaction();   
            final Employee em = (Employee) session.get(Employee.class, id); //按ID查   
            //因为 员工的 "部门" 属性会懒加载,   
            //在session关闭后,调用em.getDepart()无法取到部门信息   
            //所以这里用 Hibernate.initialize(em.getDepart()) 提前加载一下.   
            //是em.getDepart() 而不是em.   
            Hibernate.initialize(em.getDepart());   
            tx.commit();   
        return em;   
        }   
    finally  
        {   if (session != null)   
            {   
            session.close();   
            }   
    }   
  
}  



输出的SQL是:

Hibernate: select employee0_.id as id1_0_, employee0_.`name` as name2_1_0_, employee0_.depart_id as depart3_1_0_ from Employee employee0_ where employee0_.id=?

 

Hibernate: select department0_.id as id0_0_, department0_.`name` as name2_0_0_ from Department department0_ where department0_.id=?

 

做了两次查询, 没有使用 join on ,  想使用join on 还要配置. 默认不用.

 

关于懒加载,  会在以后的文章中专门讲, 这里先不讲, 只是用了用 Hibernate.initialize(em.getDepart()) 提前加载
分享到:
评论

相关推荐

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    在本篇关于MyBatis框架的学习中,我们将深入探讨一对一关联映射和一对多关联映射的概念、配置以及在实际开发中的应用。MyBatis是一个优秀的持久层框架,它允许开发者将SQL语句直接写在XML配置文件或者注解中,从而...

    MyBatis的一对一关联映射

    在实际的项目开发中,数据库中的表与表之间经常存在各种关联关系,比如一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)关系。本篇文章将重点讲解如何在 MyBatis 中实现一对一的关联映射。 一...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate关联映射详解

    包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。

    实现Mybatis框架中一对多关联映射的查询操作。

    在处理复杂的数据库关联关系时,比如一对一、一对多、多对一、多对多等,Mybatis提供了灵活的映射机制。本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型映射方式。这种关联通常发生在两个实体之间,且每个实体都只有一个对应的实例。本篇文章将详细探讨双向一对一主键关联映射...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    hibernate 双向多对多关联映射练习

    在Java的持久化框架Hibernate中,双向多对多关联映射是一种常见的数据关系模型,它允许两个实体类之间存在多个实例互相引用的情况。本练习旨在帮助开发者深入理解并熟练运用这种映射方式。通过以下详细讲解,我们将...

    SpringBoot中mybatis表关联映射关系(一对多嵌套:结果方式)

    SpringBoot 中 MyBatis 表关联映射关系(一对多嵌套:结果方式) 在 SpringBoot 中,MyBatis 是一个非常流行的持久层框架,它提供了强大的持久化功能,能够将 Java 对象与数据库表进行映射。在实际开发中,我们经常...

    多对多的关联映射--基于SSH开发

    本主题聚焦于SSH框架中的“多对多”关联映射,这是一种数据库设计模式,允许一个实体与多个其他实体相互关联。下面将深入探讨这一关键概念及其在SSH框架下的实现。 首先,让我们理解“多对多”关联。在关系数据库中...

    Springboot中mybatis表关联映射关系(一对一)

    在 Springboot 中,MyBatis 提供了强大的表关联映射关系机制,可以实现一对一、多对一、多对多等各种关联关系。在本文中,我们将详细介绍 Springboot 中 MyBatis 表关联映射关系的实现机制,特别是针对一对一关联...

    hibernate3.2(六)多对一关联映射

    在本篇关于“Hibernate3.2(六)多对一关联映射”的主题中,我们将深入探讨在Java Persistence API(JPA)框架下,如何利用Hibernate实现多对一的关联映射。Hibernate作为JPA的一个实现,是Java开发中常用的ORM...

    hibernate一对多关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对多关联映射是一种常见的关系映射方式,它用于表示一个实体(如用户)可以拥有多个子实体(如订单)的情况。在本篇文章中,我们将深入探讨如何实现双向关联的一对多映射,以及在...

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    接下来,我们来看多对多关联映射。在数据库中,多对多关系表示两个表中的记录都可以相互关联。在Hibernate中,这通常通过中间表(或关联表)来实现,使用`@ManyToMany`注解。例如,一个学生可以选修多门课程,一门...

    一对一双向关联映射

    在Java持久化框架Hibernate中,一对一双向关联映射是一种重要的数据对象关系映射策略,它允许我们在数据库中的两个实体之间建立一对一的关系,并且在Java对象模型中可以从任一侧访问另一侧的对象。这种映射方式增加...

    hibernate多对一关联映射

    **标题:Hibernate多对一关联映射** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作。"多对一"关联映射是Hibernate中的一种常见关系类型,用于表示实体...

    Hibernate一对一关联映射(注解)

    一对一关联映射是指在数据库中两个表之间存在一对一的关系,例如,一个人只有一个身份证,一个身份证也只属于一个人。在Hibernate中,我们可以通过@OneToOne注解来实现这种映射。 ### @OneToOne注解 1. **注解位置...

    hibernate 单向多对多关联映射练习

    本练习主要关注的是Hibernate中的单向多对多关联映射,这是一种常见的关系数据库设计模式,用于表示两个实体间复杂的关系。 在多对多关联中,两个实体类可以相互拥有多个实例,但只在一个方向上建立关联。例如,...

Global site tag (gtag.js) - Google Analytics