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中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...
随机推荐
- Android Studio快捷键
一.android studio 默认快捷键 刚开始接触一款开发软件,想必很想了解它的快捷方式,这会对你的编程起到很好的帮助,提高工作效率,接下来给你介绍下Android Studio一些常用的快 ...
- android_m2repository_rxx.zip下载地址以及MD5
地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E646 ...
- Ajax.BeginForm方法 参数
感谢博主 http://www.cnblogs.com/zzgblog/p/5454019.html toyoung 在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Aja ...
- Mysql - 查询之关联查询
查询这块是重中之重, 关系到系统反应时间. 项目做到后期, 都是要做性能测试和性能优化的, 优化的时候, 数据库这块是一个大头. sql格式: select 列名/* from 表名 where 条件 ...
- Centos6.5 配置Nginx开机自启动
1.在/etc/init.d/目录下创建 nginx 文件,内容如下: #!/bin/sh # # nginx - this script starts and stops the nginx dae ...
- Linux设备文件简介(转载)
Linux 中的设备有2种类型:字符设备(无缓冲且只能顺序存取).块设备(有缓冲且可以随机存取).每个字符设备和块设备都必须有主.次设备号,主设备号相同的设 备是同类设备(使用同一个驱动程序).这些设 ...
- Jquery对网页高度、宽度的操作
Jquery获取网页的宽度.高度 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: doc ...
- Web 前端攻防(2014版)
在百度 FEX 团队时写的.有次让我写点前端开发中注意的安全规范,结果写着写着就跑题了,写了一堆纯前端实现的攻击方式...当然还有防范措施. 文章就懒得粘过来了~ 直接贴个地址算了:) http:// ...
- Ubuntu(Linux) + mono + xsp4 + nginx +asp.net MVC3 部署
折腾了一下,尝试用Linux,部署mvc3. 分别用过 centos 和 ubuntu ,用ubuntu是比较容易部署的. 操作步骤如下: 一.终端分别如下操作 sudo su ->输入密码 a ...
- ABP理论之CSRF
返回总目录 本篇目录 介绍 ASP.NET MVC ASP.NET WEB API ASP.NET Core[以后补上] 客户端类库 内部原理 介绍 CSRF[Cross-Site Request F ...