- 浏览: 7189572 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (397)
- 架构研究 (44)
- 网络协议-TCP/HTTP (20)
- SPRING (23)
- HIBERNATE 3 (30)
- STRUTS 2 (20)
- Java/J2se (25)
- Servlet/Jsp (9)
- 开发工具IDE (10)
- WEB服务器 (17)
- 前端--Java Script (33)
- 前端--CSS (7)
- OS--Linux (31)
- OS--MAC OS (19)
- MySQL数据库 (19)
- Oracle数据库 (11)
- 项目管理工具 (12)
- 数据报表技术 (4)
- 图像处理技术 (10)
- 其它综合技术 (13)
- 权限管理 (1)
- MyBatis (1)
- 网络安全 (6)
- IO (21)
- PostgreSQL (2)
- Eclipse RCP (1)
- GWT (1)
- 算法 (3)
- Storm (2)
- zookeeper (3)
- 消息 (1)
最新评论
-
bukebuhao:
已解决,打开文件太多。ulimit -n 上次临时生效后再次s ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
bukebuhao:
ds重启后启动不了。报错信息如下,请大神帮助[2018-08- ...
TFS(Taobao File System)配置dataServer、分区、挂载数据盘 -
墨上清:
感谢,看完有了一个完整的知识网络。
Spring MVC 教程,快速入门,深入分析 -
云卷云舒灬:
谢谢,学到很多
Spring MVC 教程,快速入门,深入分析 -
luozhy:
非常感谢非常感谢
Project Web Access ActiveX控件 安装
多对一的例子 , 多个员工 对 一个部门 (Hibernate3.2)
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>
hibernate.cfg.xml 文件实在没什么好说的,就不显示了, 想看的下载附件.
我们来保存员工 和 部门:
package dao; import org.hibernate.Session; import org.hibernate.Transaction; import dao.po.Department; import dao.po.Employee; /** * 多对一的例子 , 多个员工 对 一个部门 * */ public class Many2One { /** * @param args */ public static void main(final String[] args) { add(); //添加两个员工, 一个部门 } /** * 添加两个员工, 一个部门 */ public static void add() { final Department depart = new Department(); //部门 depart.setName("技术部"); final Employee em1 = new Employee(); //员工 一 em1.setName("赵磊"); em1.setDepart(depart); final Employee em2 = new Employee(); //员工 二 em2.setName("陈加俊"); em2.setDepart(depart); Session session = null; try { session = HibernateUtil.getSeesion(); final Transaction tx = session.beginTransaction(); session.save(depart); //先插入部门 session.save(em1); //后插入员工, 因为员工的外键是 部门 session.save(em2); tx.commit(); } finally { if (session != null) { session.close(); } } } }
注意:保存的顺序:
第一种:
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()) 提前加载
- My-Hibnate.rar (10.8 KB)
- 下载次数: 67
发表评论
-
Hibernate二级缓存 ---- 最佳实践
2010-11-08 10:17 39286作者:赵磊 博客:ht ... -
Hibernate--泛型DAO
2010-06-27 19:49 5057泛型DAO(翻译) http://www.iteye.com ... -
Hibernate--空位
2010-06-27 15:41 1797原文章已合并整理到: http://elf8848.itey ... -
Hibernate二级缓存 ---- 入门示例
2010-06-27 15:34 4151一. 我们使用oscache来演示 , 引入oscache的j ... -
Hibernate 操作Blob Clob
2010-06-14 16:50 5251Photo.java import java.sql.Bl ... -
Hibernate ---- 控制日志
2010-06-06 11:46 3043Hibernate版本 3.3或3.4 Hibernate ... -
Hibernate悲观锁定与乐观锁定
2010-05-17 15:08 2244悲观锁定 由数据库方面实现. 可见:Hibernate悲观锁 ... -
Hibernate懒加载深入分析
2010-05-14 11:22 8283[size=small] ------------------ ... -
Hibernate批量操作(JDBC批量操作)
2009-03-30 14:52 8403部分内容转自 :http://ga ... -
Hibernate分页查询与泛型
2009-03-26 19:03 7358JE有两篇文章,关于分页查询 与泛型 的,写的很好.这里收藏一 ... -
20 Hibernate 1+N问题的原理与解决
2009-03-04 09:44 13076什么时候会遇到1+N的问题? 前提:Hibernate默认表 ... -
19 Criteria查询,DetachedCriteria离线查询 --做综合查询
2009-03-04 09:35 3732通过Session得到Criteria类的对象 /** ... -
空位空位
2009-03-03 10:22 2334空位空位空位空位 -
17 继承(四)每一个具体的类 映射到一张表
2009-03-02 13:54 2297类(Person) , 男人(Men)继 ... -
16 继承(三)(把前面14,15讲的情况结合起来)
2009-03-02 13:30 2092人类(Person) , 男人(Men)继承"人& ... -
15 继承(二)(每个子类扩展的属性单独保存在一张表中)
2009-03-02 13:07 2069人类(Person) , 男人(Men)继承" ... -
14 继承(一)(整个继承树映射到一张表)
2009-03-02 11:00 2226人类(Person) , 男人(Men)继承" ... -
13 级联和关系维护(Cascade 和Inverse)
2009-03-01 17:58 3041Cascade用来说明当对主对象进行某操作时, 是否对其关联的 ... -
12 映射-- 集合类的映射(Set,List,Map,Array)
2009-03-01 16:18 2622部门类Department , 他有 empa1, emp ... -
11 映射-- 组件映射(人类与姓名类)
2009-03-01 15:26 2362User类: 注意他的name属性 package ...
相关推荐
标题中的“8 映射-- 一对多(部门对员工)”指的是在数据库设计和对象关系映射(ORM)中常见的关系类型,特别是使用Hibernate框架时的处理方式。在这个场景中,“部门”与“员工”之间存在一对多的关系,即一个部门...
本教程将深入探讨Spring和Hibernate结合使用时的一对多关联映射,特别是部门与员工表的级联添加。 在数据库设计中,一对多关联是一个常见的关系类型,例如一个部门可以有多名员工,但每个员工只能属于一个部门。在...
在数据库关系模型中,一对多关系是常见的关联类型,例如一个学生可以对应多个课程,一个部门可以有多个员工等。MyBatis提供了一对多映射功能,使得在Java对象中可以直接获取到这种关联关系的数据。 1. **配置一对多...
首先,我们需要在映射文件中定义主表(一对一端)和从表(多对一端)的映射。假设我们有一个`User`类对应`users`表,一个`Order`类对应`orders`表,其中`orders`表有一个`user_id`字段作为外键关联到`users`表。 在...
一对一映射在数据库设计中是指两个表之间存在一对一的关系,例如,一个员工可能只有一个部门,一个部门也只对应一个员工。在iBATIS中,这种关系可以通过配置XML映射文件或者注解来实现。 **一对一映射的基本概念:*...
2. **多对一关联**:例如,每个员工属于一个部门,可以创建一个Department类(对应Department表)和Employee类。Employee类有一个Department对象的引用,表示员工属于一个部门,而部门可以有多个员工。 3. **多对多...
一对多映射指的是一个父类实体对应多个子类实体的关系,例如一个学生可以有多个课程,一个部门可以有多名员工等。 一、一对多映射的基本概念 在数据库中,如果一个表的记录(主表)与另一个表的记录(从表)之间...
多对一映射表示多个实体(如员工)可以关联一个实体(如部门)。在数据库层面,这表现为多个表(员工表)的记录关联同一个表(部门表)的一条记录。 **配置方式**: 多对一映射通过`<many-to-one>`标签实现,定义在...
一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其下的所有员工,员工并不知道它们所属的部门。 二、配置映射文件 在Hibernate中...
"ssh--Employee_Dept--员工部门管理的CRUD"这个项目显然就是利用SSH框架实现了一个员工部门管理的系统,涵盖了增删改查(Create, Read, Update, Delete)的基本功能。下面我们将深入探讨SSH框架以及在员工部门管理中...
对于一对多的关系,例如一个部门有多名员工,MyBatis提供了以下方法进行映射: 1. **使用collection标签**:在resultMap中使用collection标签,指定一对多关联的集合类型(如List),通过column属性设置关联的外键...
`表示一个员工隶属于一个部门,这是多对一关系。在映射配置文件中,需要使用`@OneToMany`和`@ManyToOne`注解来指定这些关系。 2. 多对多映射: 对于多对多关系,如项目和开发人员的关联,一个项目可能有多个开发...
// 使用@ManyToOne注解声明多对一关系 @ManyToOne @JoinColumn(name = "user_id") private User user; // getters and setters } ``` **3. 关联的属性和操作** 在`User`类中,`orders`字段被标记为`@...
对于这个“多对一单向关联”,我们将仅在“多”端(员工实体)的映射中进行配置,因为它是单向的,即部门不会知道它有哪几个员工。 在XML映射文件中,我们可能会看到如下配置: ```xml <!-- 员工实体映射 --> ...
- 在多对一关系中,通常在“一”的一方维护关系,因为一个部门可以有多个员工,但一个员工只有一个部门。所以在`Employee`类中,`department`属性是`Department`类型,表示员工所属的部门。 - Hibernate提供了懒...
在本示例中,我们将深入探讨如何在EF6中配置和使用多对多和一对多关系,特别是针对Oracle数据库的配置。 首先,多对多关系是指两个实体类型之间存在多个连接,每个实体都可以关联到多个实例。例如,一个学生可以...
2. **多对多(N:M)关系映射**: - 多对多关系表示两个实体之间存在多种关联的可能性。这种情况下,通常需要创建一个新的关联表来存储两个实体间的关联信息。 - 比如,课程和学生之间的关系,一个学生可以选修多门...
在上面的部门与员工的例子中,如果我们将关注点放在员工上,那么可以说每个员工对应一个部门,这就是多对一关系。实际上,我们在`Employee`类中已经实现了这个关系,因为每个员工可以属于一个部门,而一个部门可以有...
在本篇【myeclipse试用小记----Hibernate多对一双向关联(2)】中,博主主要探讨了使用MyEclipse集成开发环境与Hibernate框架进行多对一双向关联的配置与实现。MyEclipse是Eclipse的一个强大扩展,特别适合Java Web...