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++四种cast操作符
C 风格(C-style)强制转型如下: (T) expression 或 T(expression) //函数风格(Function-style) 两种形式之间没有本质上的不同. 对于具有转换的简 ...
- 前端知识点一HTML相关知识点
1.浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层.表示层.行为层 分别是:HTML.CSS.JavaScript 作用:HTML实现页面结构,CSS完成页面的表现与风格,JavaSc ...
- es5 中类的2种基本实现方法
function test(){ this.a = 1; this.func = function(){ // var a = 3;下面的this 取的是上面的1,这个不影响 return this. ...
- ora2pg数据迁移
1.安装strawberry-perl-5.242.安装ora2pg-17.4 #perl Makefile.PL #dmake && dmake install3.安装ora2pg相 ...
- 8.MyBatos的动态Sql
1.创建javaWeb项目MyBatis_dynamicSQL并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17. ...
- redis简单总结
一.redis的准备. 下载redis:路径:Linux:http://www.redis.io.comwindow:http://www.newasp.net/soft/67186.html 解压后 ...
- Gentoo网络管理方法总结
OpenRC/netifrc Netifrc is a collection of modules created to configure and manage network interfaces ...
- mysql5.5修改字符编码
因为mysql版本问题,网上各种修改编码的方法都不行,最后找到下面这条,终于解决! [mysqld]下添加: character-set-server=utf8 collation-server=ut ...
- GD库 图片缩略图 图片水印
/** * GD库 图片缩略图 *//*$image = imagecreatefromjpeg("1.jpg");var_dump($image);exit;$width = i ...
- sql-yog
sqlyog及类似工具的使用 #建表 #索引 #联合索引 #前缀索引 #表注释 #sql语句