多对一的例子 , 多个员工 对 一个部门 (Hibernate3.2)
package dao.po;
/**
* @author zl 员工类
*/
public class Employee
{
private intid;// 员工的ID
private Stringname;// 员工的名称
private Departmentdepart; //员工所在部门, 是多对一关系
}
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()) 提前加载
分享到:
相关推荐
NULL 博文链接:https://elf8848.iteye.com/blog/340809
Hibernate 一对多关联映射的测试,主要使用部门与员工的级联关系进行添加测试.
1:Hibernate的关联映射,存在一...多个员工属于一个部门【多对一映射】 1.2:多对多,举例说明: 项目和开发员工:【双向一对多即多对多映射】 一个项目有多个开发人员【一对多】 一个开发人员参与多个项目【一对多】
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
里面有人事企业管理系统数据, 可以免创建直接用 管理员对员工属于一对...根据实体关系模型中,一对一,一对多,多对多的关系进行设计,通过外键,主键这些进行表跟表间的之间映射关系,基本表结构通过三范式进行制作
4 Mybati数据库DAO层采用的是Mapper代理开发方法,输入映射采用的是POJO包装类型实现,输出映射采用了resultMap类型,实现了数据库多对一映射。 5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。 ...
简单人力资源应用示例这是人事部门的申请。 它允许用户添加,编辑或删除员工。 使用Hibernate进行对象关系映射的示例。
实体完整性域完整性引用完整性自定义完整性表操作创建数据库表 SQL Server的数据类型思考创建数据库表思考创建数据库表思考选择主键的原则创建数据库表思考创建数据库表创建数据库表关系图主表和从表创建数据库表-7 ...
一、安装文件服务器 1、确认操作系统 2、安装文件服务器(演示) 第7页/共13页 文件服务器的搭建-配置与管理全文共13页,当前为第7页。 二、设置信息资料的共享 1、添加共享文件夹(演示) 2、设置最大用户、修改...
由于职务信息与员工的对应关系是多对多关系,职务关系与部门的对应关系是一对多的关系,所以这里需要两张中间表来维系它们之间的关系 5. 员工信息与职务信息中间表s -------- <项目介绍> 该资源内项目源码是个人的...
中小型企业.有两个部门,销售部(vlan 10)与行政部...由于从运营商只获取到一个公网IP地址,所以企业员工上网需要做NAT网络地址转换.PS:由于实验 需要涵盖CCNA所有知识点,所以设计的实验环境与现实工程考虑并不完全一致.