Hibernate关联映射 映射文件的配置
一:多对一单向关联
首先我们必须创建两个实体类
例如:Dept类
public class Dept {
private Integer deptNo;
private String dName;
private String loc;
private Set<Employee> emps=new HashSet<Employee>();
Employee类
public class Employee {
private Integer empno;
private String ename;
private Dept dept;
现在我们可以在配置文件里面配置了
Dept.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.entity">
<class name="Dept" table="Dept">
<id name="deptNo" column="deptNo">
<generator class="native"/>
</id>
<property name="dName" type="string" column="dName"/>
<property name="loc" type="string" column="loc"/>
<!--cascade:级联 inverse:反转 -->
<set name="emps" cascade="save-update" inverse="true" >
<key column="deptNo"></key>
<!--一对多 -->
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.entity">
<class name="Employee" table="Employee">
<id name="empno" column="empno">
<generator class="native"/>
</id>
<property name="ename" type="string" column="ename"/>
<!--多对一 -->
<many-to-one name="dept" column="deptNo" class="Dept"></many-to-one>
<set name="projects" inverse="true" table="proemp">
<key column="rempNo"></key>
<many-to-many class="Project" column="rproNo"></many-to-many>
</set>
</class>
</hibernate-mapping>
到这里,一对多 和多对一的关联 配置已经完成!!
我们一起来看看测试类
// 添加数据
private static void addDeptAndEmployee() {
Session currentSession = HibernateUtil.currentSession();
currentSession.beginTransaction();
Dept dept = new Dept();
//dept.setDeptNo(deptNo)
dept.setdName("质管部22");
dept.setLoc("北京22");
Employee emp = new Employee();
emp.setEname("龙龙");
emp.setDept(dept);//建立dept 到employee 对象的 关联
currentSession.save(emp);
currentSession.save(dept);
currentSession.getTransaction().commit();
HibernateUtil.closeSessio();
System.out.println("add ok");
}
// 级联保存 cascade:级联
private static void addDeptAndEmployeeTocascade() {
Session currentSession = HibernateUtil.currentSession();
currentSession.beginTransaction();
Dept dept = new Dept();
// dept.setDeptNo(deptNo)
dept.setdName("质管部22");
dept.setLoc("北京22");
Employee emp = new Employee();
emp.setEname("龙龙");
// 建立Dept对象 和Employee 对象的 一对多 双向关系
emp.setDept(dept);
dept.getEmps().add(emp);//
currentSession.save(dept);
currentSession.getTransaction().commit();
HibernateUtil.closeSessio();
System.out.println("add ok");
}
我们谈到关联映射的多对多配置呢,有一种挺不好配置的,所以呢,就放到了这里给大家参考
第一种:建立多对多双向关联 拆成两个一对多
三个实体类
Employee
private Integer empno;
private String ename;
private Dept dept;
);//集合 类 employee的属性
);
Project
private Integer proNo;//项目的编号 private String proName;//项目名称 private Set<Employee> employees=new HashSet<Employee>(0);//集合 类 employee的属性 private Set<ProEmp> pe=new HashSet<ProEmp>(0);
中间表
ProEmp
private Integer id;
private Project pro;
private Employee emp;
映射文件
Employee.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.three.entity">
<class name="Employee" table="Employee">
<id name="empno" column="empno">
<generator class="native"/>
</id>
<property name="ename" type="string" column="ename"/>
</class>
</hibernate-mapping>
Project.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.three.entity">
<class name="Project" table="Project">
<id name="proNo" column="proNo">
<generator class="native"/>
</id>
<property name="proName" type="string" column="proName"/>
</class>
</hibernate-mapping>
ProEmp.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.three.entity">
<class name="ProEmp" table="ProEmp">
<id name="id" column="id">
<generator class="native"/>
</id>
<!-- 与员工关联 -->
<many-to-one name="emp" column="empno" class="Employee"></many-to-one>
<!-- -与project关联 -->
<many-to-one name="pro" class="Project" column="proNo"></many-to-one>
</class>
</hibernate-mapping>
大配置文件hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">wgy</property>
<property name="connection.password">jpp</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect --><!-- SQL 方言 -->
<property name="dialect">
org.hibernate.dialect.Oracle10gDialect
</property>
<!-- Enable Hibernate's automatic session context management -->
<!-- <property name="current_session_context_class">thread</property>
-->
<!-- Disable the second-level cache -->
<!-- <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
-->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<!--序列化 -->
<property name="hbm2ddl.auto">create</property>
<!-- <property name="hbm2ddl.auto">update</property> -->
<!-- sql语句格式化 -->
<property name="format_sql">true</property>
<!-- 资源 -->
<<mapping resource="cn/three/entity/Dept.hbm.xml" />
<mapping resource="cn/three/entity/Employee.hbm.xml" />
<mapping resource="cn/three/entity/Project.hbm.xml" />
</session-factory>
</hibernate-configuration>
测试类看一下效果
package cn.main;
import org.hibernate.Session;
import cn.three.entity.ProEmp;
import cn.three.entity.Employee;
import cn.three.entity.Project;
import cn.util.HibernateUtil;
public class ThreeTest {
public static void main(String[] args) {
//三表一起
threeAddEmpAndProAndProEmp();
}
private static void threeAddEmpAndProAndProEmp() {
Session session = HibernateUtil.currentSession();
session.beginTransaction();
Employee emp=new Employee();
Project pro=new Project();
emp.setEname("李四");
pro.setProName("一号项目");
ProEmp pe=new ProEmp();
pe.setEmp(emp);
pe.setPro(pro);
session.save(pro);
session.save(emp);
session.save(pe);
session.getTransaction().commit();
HibernateUtil.closeSessio();
System.out.println("add ok");
}
}
第二种:不用拆成两个一对多
只需要两个映射文件,即可
Employee.hbm.xml
复制代码
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.entity">
<class name="Employee" table="Employee">
<id name="empno" column="empno">
<generator class="native"/>
</id>
<property name="ename" type="string" column="ename"/>
<!--多对一 -->
<many-to-one name="dept" column="deptNo" class="Dept"></many-to-one>
<!--多对多双向关联 -->
<set name="projects" inverse="true" table="proemp">
<key column="rempNo"></key>
<many-to-many class="Project" column="rproNo"></many-to-many>
</set>
</class>
</hibernate-mapping>
Project.hbm.xml
复制代码
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.entity">
<class name="Project" table="Project">
<id name="proNo" column="proNo">
<generator class="native"/>
</id>
<property name="proName" type="string" column="proName"/>
<!--配置单向多对多关联 -->
<!-- 映射project 类的employees的属性 -->
<!--cascade="save-update":表名保存或更新project对象时,会级联保存或更新与它关联的Employee对象 -->
<set name="employees" table="proemp" cascade="save-update">
<key column="rproNo"></key>
<many-to-many class="Employee" column="rempNo"></many-to-many>
</set>
</class>
</hibernate-mapping>
测试类
复制代码
private static void addProToEmpAndEmpToPro() {
Session session = HibernateUtil.currentSession();
session.beginTransaction();
Employee emp=new Employee();
Project pro=new Project();
emp.setEname("李四");
pro.setProName("一号项目");
pro.getEmployees().add(emp);
session.save(pro);
session.getTransaction().commit();
HibernateUtil.closeSessio();
System.out.println("add ok");
这样就可以了,有问题在线解答!!!!!
Hibernate关联映射 映射文件的配置的更多相关文章
- hibernate关联非主键注解配置
现在有两张表:一张t_s_user用户表和t_s_user_serial_number用户序号表 CREATE TABLE `t_s_user` ( `id` ) NOT NULL, `email` ...
- hibernate映射xml文件配置之一对多,多对多
一对多配置 [1]班级和学生模型 --->班级可容纳多个学生 --->学生只能属于一个班级 [2]一对多配置中的关系维护(inverse) --->一端放弃关系的维护 ---> ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- Hibernate 配置文件与映射文件 总结
hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 一.Hibernate配置文件详解 Hibernate配置文件有两种形式:XML与p ...
- Hibernate关联映射及高级查询
一.Hibernate中的关联关系 1.1.单向一对多关联关系 按照以下步骤配置hibernate中持久化类的一对多对象关联: (1).持久化类添加关联类的相关属性及getter/setter方法. ...
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- 【转】hibernate中的映射文件xxx.hbm.xml详解总结
一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容: (1).映射内容的定义: Hibern ...
- 分享知识-快乐自己:Hibernate 关联映射
关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...
随机推荐
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- docker4dotnet #2 容器化主机
.NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...
- 简历生成平台项目开发-STEP1问卷设计
周五课程结束完后,小组建立QQ群和微信群,着手讨论项目问题.一开始的大概想法:就业信息平台,收集企业招聘信息和就业生资料,提供给学生和企业的校企对接平台.后来发现群里谭卓同学也有个相关的思路,经过商量 ...
- sql server 取文件名函数 转载
/****** Object: UserDefinedFunction [dbo].[GetDirectoryPath] Script Date: 2016-12-16 16:54:05 ****** ...
- 《高性能javascript》一书要点和延伸(下)
第六章 快速响应的用户界面 本章开篇介绍了浏览器UI线程的概念,我也突然想到一个小例子,这是写css3动画的朋友都经常会碰到的一个问题: <head> <meta charset=& ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
- Linux3 在VMware中搭建CentOS6.5虚拟机
前言: 本文主要是我在大家hadoop集群之前 ,需啊先安装CentOS虚拟机,记录在此,作为参考.如果能帮助到其他人,自然是更好啦. =========================== ...
- [Mahout] 完整部署过程
概述 Mahout底层依赖Hadoop,部署Mahout过程中最困难的就是Hadoop的部署 本文假设用户本身没有进行Hadoop的部署,记述部署Mahout的过程 ...