8.Hibernate的多对多关联映射
1.创建如下数据库脚本
--1.1 项目表
create table PROJECT
(
proid NUMBER(6) not null,
proname VARCHAR2(50)
)
;
--1.2 项目表主键
alter table PROJECT
add constraint PK_PROJECT_PROID primary key (PROID); --2.1 员工表
create table EMPLOYEE
(
empid NUMBER(6) not null,
empname VARCHAR2(50)
)
; --2.2 员工表主键
alter table EMPLOYEE
add constraint PK_EMPLOYEE_EMPID primary key (EMPID); --3.1中间表
create table PROEMP
(
rproid NUMBER(6) not null,
rempid NUMBER(6) not null
)
;
--3.2 中间表主外健
alter table PROEMP
add constraint PK_PROEMP primary key (RPROID, REMPID); alter table PROEMP
add constraint FK_PROEMP_REMPID foreign key (REMPID)
references EMPLOYEE (EMPID); alter table PROEMP
add constraint FK_PROEMP_RPROID foreign key (RPROID)
references PROJECT (PROID);
2.创建javaweb项目Hibernate_Part4_C2
3. 在项目的src下创建hibernate.cfg.xml的主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
<session-factory>
<!-- 数据库就的url地址 -->
<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <property name="dialect"> org.hibernate.dialect.Oracle10gDialect</property> <!-- 数据库驱动 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <!-- 数据库用户名 -->
<property name="connection.username">scott</property> <!-- 数据库密码 -->
<property name="connection.password">tiger</property> <!-- 显示sql语句 -->
<property name="show_sql">true</property> <!-- sql语句格式化 -->
<property name="format_sql">true</property> <!-- 注册映射文件 -->
<mapping resource="com/entity/Project.hbm.xml"/>
<mapping resource="com/entity/Employee.hbm.xml"/>
</session-factory> </hibernate-configuration>
hibernate.cfg.xml
4.在项目的src下的com.entity包下创建Employee.java类
package com.entity; import java.util.HashSet;
import java.util.Set; public class Employee {
private Integer empid;
private String empname;
private Set<Project> projects=new HashSet<Project>(); public Employee() {
} public Employee(Integer empid, String empname) {
this.empid = empid;
this.empname = empname;
} public Employee(Integer empid, String empname, Set<Project> projects) {
this.empid = empid;
this.empname = empname;
this.projects = projects;
} public Integer getEmpid() {
return empid;
} public void setEmpid(Integer empid) {
this.empid = empid;
} public String getEmpname() {
return empname;
} public void setEmpname(String empname) {
this.empname = empname;
} public Set<Project> getProjects() {
return projects;
} public void setProjects(Set<Project> projects) {
this.projects = projects;
} @Override
public String toString() {
return "Employee [empid=" + empid + ", empname=" + empname
+ ", projects=" + projects + "]";
} }
Employee.java
5.在项目的src下的com.entity包下创建Employee.hbm.xml映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!-- 持久化类的映射文件 -->
<class name="com.entity.Employee" table="EMPLOYEE">
<!-- 主键映射 -->
<id name="empid" type="java.lang.Integer" column="empid">
<!-- 主键插入由应用程序负责生成 -->
<generator class="assigned"/>
</id>
<!-- 普通字段映射 -->
<!-- 员工名称称映射 -->
<property name="empname" type="java.lang.String" column="EMPNAME"/> <!-- 多对多 中间表字段-->
<set name="projects" table="PROEMP" inverse="true">
<!-- 中间表和员工表关联的外键字段 -->
<key column="REMPID"></key> <!-- 员工中的项目集合 -->
<many-to-many class="com.entity.Project" column="RPROID"/>
</set>
</class>
</hibernate-mapping>
Employee.hbm.xml
6.在项目的src下的com.entity包下创建Project.java类
package com.entity; import java.util.HashSet;
import java.util.Set; public class Project {
private Integer proid;
private String proname;
private Set<Employee> employees=new HashSet<Employee>(); public Project() {
}
public Project(Integer proid, String proname) {
this.proid = proid;
this.proname = proname;
} public Project(Integer proid, String proname, Set<Employee> employees) {
this.proid = proid;
this.proname = proname;
this.employees = employees;
}
public Integer getProid() {
return proid;
}
public void setProid(Integer proid) {
this.proid = proid;
}
public String getProname() {
return proname;
}
public void setProname(String proname) {
this.proname = proname;
} public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
@Override
public String toString() {
return "Project [employees=" + employees + ", proid=" + proid
+ ", proname=" + proname + "]";
} }
Project.java
7.在项目的src下的com.entity包下创建Project.hbm.xml映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<!-- 持久化类的映射文件 -->
<class name="com.entity.Project" table="PROJECT">
<!-- 主键映射 -->
<id name="proid" type="java.lang.Integer" column="PROID">
<!-- 主键插入由应用程序负责生成 -->
<generator class="assigned"/>
</id>
<!-- 普通字段映射 -->
<!-- 项目名称称映射 -->
<property name="proname" type="java.lang.String" column="PRONAME"/>
<set name="employees" table="PROEMP" cascade="save-update">
<!-- 中间表和项目表关联的外键字段 -->
<key column="RPROID"></key>
<many-to-many class="com.entity.Employee" column="REMPID"/>
</set>
</class>
</hibernate-mapping>
Project.hbm.xml
8.在项目的src下的com.util包下创建HibernateUtil.java类
package com.util; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
/*
* 1.创建用线程管理session的对象 还要导入org.hibernate.Session资源
*/
private static final ThreadLocal<Session> threadLoad = new ThreadLocal<Session>(); /*
* 2.定义读取配置文件的对象
*/
private static Configuration configuration = null; /*
* 3.定义SessionFacotry工厂对象
*/
private static SessionFactory sessionFactory = null; /*
* 4.读取配置文件
*/
static {
try {
// 读取配置文件
configuration = new Configuration().configure(); // 创建session工厂对象
sessionFactory = configuration.buildSessionFactory();
} catch (HibernateException e) {
System.out.println("创建sessionFactory工厂对象错误");
e.printStackTrace();
}
} /**
* 5.获取Session对象
* @return session对象
*/
public static Session getSession() {
// 获取当前线程内对应的session对象,可以保证每个线程都有自己的session独享
Session session = threadLoad.get(); // 如果获取的session为null则新打开session
if (session == null) {
// 打开一个新的Session
session = sessionFactory.openSession(); // 将session对象保存到线程中
threadLoad.set(session);
}
// 返回从线程中获取的session对象
return session;
} /**
* 6.关闭session对象
*/
public static void closeSession(){
//获取当前线程内对应的session对象,可以保证每个线程对象都有自己的session对象
Session session=threadLoad.get(); //将线程中的session置空
threadLoad.set(null); //如果session不为空,则关闭session
if(session!=null){
//关闭session
session.close();
} } }
HibernateUtil.java
9.在项目的src下的com.dao包下创建ProEmpDao.java类
package com.dao; import org.hibernate.Session;
import org.hibernate.Transaction; import com.entity.Employee;
import com.entity.Project;
import com.util.HibernateUtil; public class ProEmpDao {
public static void main(String[] args) {
//开启session
Session session=HibernateUtil.getSession();
//开启事务
Transaction tx=session.beginTransaction();
//创建多个员工
Employee emp1=new Employee(1, "张三");
Employee emp2=new Employee(2, "李四"); //创建项目存在
Project p1=new Project(1, "1号项目");
Project p2=new Project(2, "2号项目"); //多个人负责一个项目
p1.getEmployees().add(emp1);
p1.getEmployees().add(emp2); //一个项目多个人负责
emp1.getProjects().add(p1);
emp2.getProjects().add(p1); //一个人负责多个项目
p2.getEmployees().add(emp1); //一个项目一个人负责
emp1.getProjects().add(p2); //保存项目时级联保存人信息
session.save(p1);
session.save(p2); tx.commit();
HibernateUtil.closeSession(); } }
ProEmpDao.java
8.Hibernate的多对多关联映射的更多相关文章
- hibernate的多对多关联映射
在我们实际项目中,多对多的情况也时长存在,比如最常见的就是系统管理的五张表,如下面的一个结构: 在本文学习hibernate多对多关联映射的实验中我简单的写几个字段,达到学习目的即可. 1.多对多的关 ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- Hibernate(六)——多对多关联映射
前面几篇文章已经较讲解了三大种关联映射,多对多映射就非常简单了,不过出于对关联映射完整性的考虑,本文还是会简要介绍下多对多关联映射. 1.单向多对多关联映射 情景:一个用户可以有多个角色,比如数据录入 ...
- hibernate之关于使用连接表实现多对一关联映射
[Hibernate]之关于使用连接表实现多对一关联映射 在我们项目使用中採用中间表最多的一般就是多对一,或者是多对多,当然一对一使用中间表也是能够的,可是这样的几率通常少之又少!所以这里重点介绍多对 ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- Hibernate ManyToOne Mappings 多对一关联映射
Hibernate ManyToOne Mappings 多对一关联映射 Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml)2.创建持久化类 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
- java之hibernate之单向的多对多关联映射
这篇 单向的多对多关联映射 1.如何在权限管理中,角色和权限之间的关系就是多对多的关系,表结构为: 2.类结构 Permission.java public class Permission impl ...
随机推荐
- C#笔记(一)常量
常量必须在声明时初始化 常量的值必须能在编译时用于计算.因此,不能用从一个变量中提取的值来初始化常量. 常量总是静态的.但注意,不必(实际上,是不允许)在常量声明中包含修饰符static .
- jsp页面根据当前时间和定义时间差计算动态倒计时
jsp页面根据当前时间和定义时间差计算动态倒计时http://www.jb51.net/article/74140.htm var maxtime =1000*60; //半个小时,按秒计算,自 ...
- Front-End(一)
前端初识 现在网站开发的市场越来越大,个人和企业都有了主页.网络办公的需求,并且随着网站开发前端和后台的工作细分,前端开发的需求也越来越大. 前端的任务是将美工的网页设计使用前端技术尽可能无差别地实现 ...
- wifi 模块
#include"STC12C5A.H" #include <string.h> #include<intrins.h> #define uint unsi ...
- JS中的call()和apply()方法理解和使用
1.方法定义call方法: 语法:obj.method.call(thisObj[,arg1[, arg2[, [,.argN]]]]) 定义:调用对象(obj)的一个方法(method),以另一个对 ...
- Java代理模式汇总
简介 代理模式即Proxy Pattern,23种java常用设计模式之一.其定义为:对其他对象提供一种代理以控制对这个对象的访问. UML类图 静态代理 目标接口 public interface ...
- layer ifram 弹出框
父层 <div class="col-xs-4 text-left" style="padding-left: 50px;"><button ...
- [Q]复制授权了文件但仍显示“未注册”问题(安装在非默认目录或目录包含中文)
1. 注意要将解压后的文件复制到CAD批量打图精灵安装目录,而不要复制文件夹,复制是提示是否需要覆盖,要选择覆盖. 2. 若通过第1步操作仍然显示“未注册”,则可能是由于安装目录含有中文或者不是默认目 ...
- 特性(Attributes)
用以将元数据或声明信息与代码(程序集.类型.方法.属性等)相关联.特性与程序实体相关联后,即可在运行时用反射技术查询特性. 例如,在一个方法前标注[Obsolete]特性,则调用该方法时VS则会提示该 ...
- github本地库及clone常用命令
新建本地库 1. cd d: 2. mkdir git 3. cd git 4. git init 5. git remote add origin git@github.com:swportal/ ...