- 浏览: 140302 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
aa87963014:
很好,但是update/insert 是否加锁 。加锁对sel ...
数据库锁 -
RobustTm:
我的这种做法也可以添加A和B
但是换成更新就有问题
hibernate入门(十一):级联操作inversin属性 -
RobustTm:
这位仁兄可以提供一对多双向关联完整的代码不?
我碰到了问题,采 ...
hibernate入门(十一):级联操作inversin属性 -
cfeers:
markxing 写道谢谢分享。。。
不客气,呵呵。
struts2.0 struts.xml配置文件详解 -
markxing:
谢谢分享。。。
struts2.0 struts.xml配置文件详解
1.多对一关系映射:
一个部门有可以有多个员工,而一个员工只属于一个部门。从员工角度看,很多员工会隶属一个部门。 现以实例说明,实例概要:一个部门类,只有id和部门名称两个属性。有一个员工类,有id和员工名称及部门对象三个属性。操作步骤如下:
>>步骤一,建立Depatment.java及实体配置文件:
同包下的实体配置文件:Depart.hbm.xml
以上的操作,没的什么可多言的,和前面的配置是一样的形式。
>>步骤二,Employee.java内容如下及实体配置文件
同包下的实体配置文件:Employee.hbm.xml
先来说这个类文件,它的一个重要属性就是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"/>
>>步骤四,编写测试类。类中省略导入包的内容。
说明:以前插入新的记录,都要传递一个实体对象,而这里没有这么做,原因是为了体现出一个插入记录的顺序问题,仔细观察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"这个属性,再来执行将会报“不能为空的错误”。通过增加这个属性,可以让我们更好理解如何建立两个对象的关联。
>>步骤五,再探查询方法。接上面,在测试类中增加一个查询方法,内容如下:
随后再在主方法中增加如下内容:便可以测试结果:
query(1);
对结果的说明分析:如果在以往的JDBC操作中,我们想得到这个部门的信息,需要查两次才能得到,这里的 Hibernate就实现了这一优化,如果我们开启了控制台的数据库显示功能(主配置文件中开启,前面已提到),便可以查看下数据库的执行操作,并切实感受到这里实际执行了两步查询操作,在以后的操作中,建议开启此属性,以便切实体会数据库操作。
>>步骤六,增加一个新的查询方法query2,内容如下,注意和query区别:
一个部门有可以有多个员工,而一个员工只属于一个部门。从员工角度看,很多员工会隶属一个部门。 现以实例说明,实例概要:一个部门类,只有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.cfg.xml文件详解(annotation 配置)
2010-08-26 15:57 1561一、 环境搭建和基本映 ... -
hibernate.cfg.xml文件详解
2010-08-26 15:56 742<?xml version='1.0' encoding ... -
hiberante入门(十七):简要总结及源码文档
2010-08-26 11:28 693十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2010-08-26 11:26 746十二、一些细节问题分 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2010-08-26 11:25 11641.事务引发的三层架构MV ... -
hiberante入门(十四):缓存2
2010-08-26 11:24 426>>步骤四、测试二 ... -
hiberante入门(十四):缓存1
2010-08-26 11:10 7611.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2010-08-26 11:07 9274.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系2
2010-08-26 11:03 963上接hiberante入门(十二 ... -
hiberante入门(十二):继承关系1
2010-08-26 11:01 8253.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hibernate入门(十一):级联操作inversin属性
2010-08-26 10:56 1501九、关联关系中的高级应用 1.级联操作: 在前面的一对多 ... -
hiberante入门(十):其它集合类型
2010-08-26 10:53 762八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2010-08-26 10:51 7735.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(八):多对多
2010-08-26 10:48 6444.多对多关系映射: 典型实例:一个学生可以有多个老师 ... -
hibernate入门(七):一对一
2010-08-26 10:42 7223.一对一关系映射: 典型的实例:一个人有一个身份证,而一个 ... -
hibernate入门(六):一对多
2010-08-26 10:36 6892.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(四):HQL QBC初步
2010-08-26 10:22 909四 完善工具类及HQL QBC ... -
hibernate入门(三):对象的三种状态
2010-08-26 10:20 687三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2010-08-26 10:17 764二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一):第一个应用实例
2010-08-26 10:15 877一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
标题"hibernate入门一:单表操作(单对象操作)"表明这篇文章主要介绍的是Hibernate框架的基础使用,特别是针对数据库单表的简单操作,如增删改查,以及如何处理单个数据库对象。描述部分为空,但通常这样的教程会...
本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之配合使用的相关组件。让我们深入探讨一下这些jar包以及它们在Hibernate中的作用。 1. Hibernate核心库: - `hibernate-core.jar`:这...
**初学Hibernate,Hibernate入门** ...随着对Hibernate的深入学习,你会发现它还支持更高级的功能,如级联操作、多对一、一对多等复杂关系映射、缓存机制、延迟加载等,这些都将极大地提升你的开发效率。
【Hibernate入门案例源码】是针对初学者设计的一份教程,旨在帮助理解并掌握Java持久化框架Hibernate的基础应用。Hibernate是一个强大的ORM(对象关系映射)框架,它简化了数据库与Java对象之间的交互,使开发者可以...
【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...
**第一部分:Hibernate入门** 这部分主要介绍了Hibernate的基本概念和安装配置。Hibernate基于Java Persistence API(JPA),它提供了对象关系映射(ORM)功能,将Java类映射到数据库表。首先,你需要下载Hibernate...
hibernate 入门:10分钟跑起这个hibernate 示例程序 (图解、附源码http://download.csdn.net/source/650851)
本教程将带你入门Hibernate的多对多实体映射,帮助你理解如何通过源码来实现这种复杂的关系映射。 一、Hibernate概述 Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,...
### Hibernate入门知识点详解 #### Hibernate概述与ORM思想 - **定义**:Hibernate是一个开源的、轻量级的对象关系映射(Object-Relational Mapping,简称ORM)框架,它主要应用于JavaEE架构中的DAO(Data Access ...
【hibernate入门--第一个实例】 Hibernate 是一个强大的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务。通过使用Hibernate,我们可以将数据库操作转换为对Java对象的操作,从而简化了数据库...
Hibernate 支持多种对象关系映射,如一对一、一对多、多对一、多对多。例如,一个User可以有多个Order: ```xml <!-- User.hbm.xml --> <!-- Order.hbm.xml --> ``` 以上就是Hibernate入门的基础内容。...
最后,书中可能会涵盖一些高级主题,如多对一、一对多、多对多的关系映射,以及继承映射、复合组件、查询优化等。这些内容都是Hibernate深入学习的重点,对于理解和掌握复杂的数据模型以及高效的数据操作至关重要。 ...
### Hibernate入门教程知识点详解 #### 一、Hibernate框架简介 **Hibernate** 是一款开放源代码的**对象关系映射(Object-Relational Mapping,简称ORM)**框架,它为Java应用提供了一种高效的机制,用于处理Java...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
13. **一对多、多对一、一对一关系映射**:理解如何在实体类间建立这些关联关系,并在映射文件或注解中进行配置。 14. **集合映射**:例如List、Set、Map等集合类型的字段与数据库表的关联映射。 15. **懒加载和...
3. **多对一(ManyToOne)**:多个实体对应一个实体实例。 4. **多对多(ManyToMany)**:多个实体可以关联多个其他实体。 ## 十、总结 通过本教程,你将掌握Hibernate的基本使用,包括环境配置、对象关系映射、...