`
neeleon
  • 浏览: 184503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate入门(七)关联关系讨论_多对一关系映射

阅读更多

1 多对一关系映射

一个部门有可以有多个员工,而一个员工只属于一个部门。从员工角度看,很多员工会隶属一个部门。 现以实例说明,实例概要:一个部门类,只有id 和部门名称两个属性。有一个员工类,有id 和员工名称及部门对象三个属性。操作步骤如下:

>> 步骤一,建立Depatment.java 及实体配置文件:

package com.asm.hibernate.domain;

public class Department {

    private int id ;

    private String name ;

    public int getId() {

       return id ;

    }

    public void setId( int id) {

       this . id = id;

    }

    public String getName() {

       return name ;

    }

    public void setName(String name) {

       this . name = name;

    }  

}

---- 同包下的实体配置文件:Depart.hbm.xml

<? 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 = "com.asm.hibernate.domain" >

 

    < class name = "Department" >

       < id name = "id" >

           < generator class = "native" />

       </ id >

       < property name = "name" ></ property >

    </ class >

</ hibernate-mapping >

以上的操作,没的什么可多言的,和前面的配置是一样的形式。

>> 步骤二, Employee.java 内容如下及实体配置文件

package com.asm.hibernate.domain;

public class Employee {

    private int id ;

    private String name ;

    private Department depart ;

    public int getId() {

       return id ;

    }

    public void setId( int id) {

       this . id = id;

    }

    public String getName() {

       return name ;

    }

    public void setName(String name) {

       this . name = name;

    }

    public Department getDepart() {

       return depart ;

    }

    public void setDepart(Department depart) {

       this . depart = depart;

    }

}

---- 同包下的实体配置文件:Employee.hbm.xml

<? 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 = "com.asm.hibernate.domain" >

 

    < class name = "Employee" >

       < id name = "id" >

           < generator class = "native" />

       </ id >

       < property name = "name" ></ property >

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

    </ class >

</ hibernate-mapping >
先来说这个类文件 ,它的一个重要属性就是 Department 对象,这就是它所关联的一个外键,这里我们只必须记住一点,每个实体类对应于一张表,如果一张表想关联另一张表,则只需要在这张表所对应的实体类中引入它想关联表的实体类对象。再进行简单的配置即可。再来看配置文件,这里主要看这个 < many-to-one name = "depart" column = "depart_id" ></ many-to-one > 元素,它的name 属性仍然是实体类中的属性。column 为对应表的外键。可以留意下数据库表中的相关表。

>> 修改主配置文件,增加以下内容以便找到相应的实体配置文件。

< mapping resource = "com/dep/emp/Employee.hbm.xml" />   

< mapping resource = "com/dep/emp/Depart.hbm.xml" />

>> 步骤四,编写测试类。类中省略导入包的内容。

package com.asm.hibernate.test;

public class ManyToOneTest {

    public static void main(String[] args) {

       add ();

    }

    static void add() {

       Session s = null ;

       Transaction tx = null ;

       try {

           Department depart = new Department();

           depart.setName( "departName" );

           Employee emp = new Employee();

           emp.setName( "empName" );

           emp.setDepart(depart);

 

           s = HibernateUtil.getSession ();

           tx = s.beginTransaction();

 

           s.save(depart);

           s.save(emp);

       // 交换以上两句的位置,看Hibernate 执行的sql 语句。会再增加一条更新操作。

           tx.commit();

       } finally {

           if (s != null )

              s.close();

       }

    }

}

说明:以前插入新的记录,都要传递一个实体对象,而这里没有这么做,原因是为了体现出一个插入记录的顺序问题,仔细观察add() 方法,发现先保存的是Department 对象,再保存的是Employee 对象,原因是什么?这里略作说明,我们知道此项目设计的是让Employee 表来关联Department 表,而要想关联此表,必须保证此表已进行存储,这里暂时这样理解,也可以试试颠倒save 方法的顺序,或是不保存depart 来看看效果,这样也许有助理解。

简要说明,以上提到的尝试性操作:颠倒顺序,可以通过,只是增加了一条更新操作;不保存dep 则不能通过,原因是此实体对象没有保存;再测试,如果注释掉“ depart.setDname( "deptName" ); ”后面按正常顺序执行,发现是能正确执行的。只是在数据库的employee 表中depart_id 字段为null ,如果我们在前面设置 < many-to-one name = "depart" column = "depart_id" > 中增加:not-null = "true" 这个属性,再来执行将会报“不能为空的错误”。通过增加这个属性,可以让我们更好理解如何建立两个对象的关联。

>> 步骤五,再探查询方法。接上面,在测试类中增加一个查询方法,内容如下:

static Employee query( int empId) {

       Session s = null ;

       try {

           s = HibernateUtil.getSession ();

           Employee emp = (Employee) s.get (Employee. class , empId);

           System. out .println( "Department Name:" + emp.getDepart().getName());

           return emp;

       } finally {

           if (s != null )

              s.close ();

       }

    }

随后再在主方法中增加如下内容:便可以测试结果:

query (1);

对结果的说明分析 如果在以往的JDBC 操作中,我们想得到这个部门的信息,需要查两次才能得到,这里的 Hibernate 就实现了这一优化,如果我们开启了控制台的 数据库显示 功能(主配置文件中开启,前面已提到),便可以查看下数据库的执行操作,并切实感受到这里实际执行了两步查询操作,在以后的操作中,建议开启此属性,以便切实体会数据库操作。

>> 步骤六,增加一个新的查询方法query2 ,内容如下,注意和query 区别:

    static Employee query2( int empId) {

       Session s = null ;

       try {

           s = HibernateUtil.getSession ();

           Employee emp = (Employee) s.get(Employee. class , empId);

           Hibernate .initialize (emp.getDepart());

           // 上一句作用后面会作说明,这里略作了解

           return emp;

       } finally {

           if (s != null )

              s.close();

       }

    }

main 方法中增加如下内容进行测试:

Employee emp = query2 (1);

System. out .println(emp.getDepart().getName());

分享到:
评论

相关推荐

    hibernate 映射关系学习入门 多对多实体映射

    本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...

    hibernate 映射关系学习入门 一对一映射

    本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...

    hibernate学习入门一对多实体映射源码

    在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...

    hibernate_one_to_one映射简单入门例子

    `hibernate_one_to_one`标签表示我们将探讨的是如何在Hibernate中实现一对一的映射关系。 **二、一对一映射的两种类型** 1. **主键关联(Primary Key Join)**:两个实体共享同一个主键,这通常意味着它们是同一个...

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|... 20_一对一外键关联关系的映射与原理分析

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    本教程将详细介绍如何使用`@Entity`、`@Table`、`@Id`等注解,以及如何进行一对一、一对多、多对多等关联映射。 9. **查询语言(HQL)与 Criteria API** Hibernate提供了自己的查询语言HQL(Hibernate Query ...

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate从入门到精通(六)一对一双向关联映射 - 赵帅 廊坊师范学院信息技术提高班

    Hibernate入门案例源码

    【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...

    hibernate入门--第一个实例

    在这个“hibernate入门--第一个实例”中,我们将了解如何设置Hibernate环境,创建实体类,配置映射文件,以及执行基本的CRUD(创建、读取、更新和删除)操作。 1. **环境搭建** - **下载与安装**: 首先,你需要从...

    Hibernate 对象关系映射

    本人在厦门邦初培训时候用的ppt 快速入门文档 内容: 建立一对多的关联关系域模型 建立一对多的参照关系的模型 映射一对多关联关系 通过hibernateAPI级联操作关联对象 其它关系的映射:一对一,多对多

    Hibernate入门(代码+笔记)

    **第一部分:Hibernate入门** 这部分主要介绍了Hibernate的基本概念和安装配置。Hibernate基于Java Persistence API(JPA),它提供了对象关系映射(ORM)功能,将Java类映射到数据库表。首先,你需要下载Hibernate...

    hibernate入门小例子

    【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...

    Hibernate入门到精通

    1. 多对一(Many-to-One)关联映射: 在多对一的关系中,一个实体(如`Group`)可以对应多个实体(如`User`)。在数据库中,这通常表现为在`User`表中有一个`groupId`字段指向`Group`表的主键。在Hibernate映射文件...

    02_传智播客hibernate教程_hibernate入门案例的细节分析

    10. **关联映射**:一對一、一对多、多对一、多对多的关系映射实现,包括@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等。 11. **缓存机制**:理解Hibernate的第一级缓存(Session级别)和第二级缓存...

    hibernate系列(一)hibernate入门

    Hibernate支持一对一、一对多、多对一、多对多等各种关系映射,通过注解或XML配置文件定义。例如,一个用户可以有多个订单,订单也可以属于一个用户: ```java @Entity @Table(name = "Order") public class Order ...

    Hibernate双向一对多经典实例

    本实例将聚焦于Hibernate中的一对多关系,这是一种常见的关联类型,尤其是在处理具有层次结构的数据时。双向一对多关系意味着一个实体可以拥有多个相关联的实体,同时每个相关联的实体也可以回指到原始实体。 **...

    hibernate入门简单实例

    15. **实体关系映射策略**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)、多对多(ManyToMany)等,理解这些关系并正确配置是使用Hibernate的关键。 通过这个"hibernate_first"实例,你可以...

    hibernate入门与概述

    - **关联关系**:关联关系是对象之间的一种联系,比如一个班级可以有多个学生,这种关系在ORM中可以通过一对一、一对多、多对一、多对多等方式实现。 - **依赖关系**:对象之间的短暂交互,如函数调用,不涉及长期...

    Hibernate_3.2.0_Reference_zh_CN

    《Hibernate 3.2.0 参考指南中文版》是一部深入浅出的Java持久化框架Hibernate的教学资源,尤其适合初学者入门。本教程详细介绍了Hibernate的核心概念、配置、对象关系映射(ORM)以及实际开发中的应用。下面将对...

Global site tag (gtag.js) - Google Analytics