Hibernate关联映射关系
Hibernate关联映射关系
一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的)
1.1创建实体类(Emp(员工),Dept(部门))
/* * 员工实体类 */public class Emp
{
private Integer empId; //员工编号
private String empName; //员工姓名
private Dept dept; //所处部门
//get(),set()方法省略
}
/*
* 部门实体类
*/
public class Dept
{
private Integer deptNo; //部门编号
private String deptName; //部门姓名
private Set<Emp> emps=new HashSet<Emp>(); //员工集合
//get(),set()方法省略
}
1.2创建小配置文件
Emp.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.a.entity">
<class name="Emp" table="Emp">
<id name="empId">
<generator class="sequence">
<param name="sequence">SEQ_Student</param>
</generator>
</id>
<property name="empName"></property>
<!-- 植入一个Dept对象 多对一 -->
<many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>
</class>
</hibernate-mapping>
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.a.entity">
<class name="Dept" table="Dept">
<id name="deptNo">
<generator class="sequence">
<param name="sequence">SEQ_Student</param>
</generator>
</id>
<property name="deptName"></property>
<set name="sets" inverse="true" cascade="save-update">
<key column="deptNo"></key> <!-- 多的一方的外建 -->
<one-to-many class="Emp" />
</set>
</class>
</hibernate-mapping>
set元素:
<set>元素的name属性:设定持久化类名,此处为Dept类的emps属性
<set>元素的子元素<key>:column属性设定与所关联的持久化类对应的表的外键,此处为Emp表的外键DepeNo字段
<set>元素的子元素<one-to-many>:class属性设定与所关联的持久化类,此处为Emp类
那么,Hibernate会根据以上映射代码获得以下信息:
1.<set>元素表明Dept类的emps属性为java.util.Set集合类型
2.<one-to-many>子元素表明emps集合中存放的是一组Emp对象
3.<key>子元素表明Emp表通过外键DeptNo参照DEPT表
1.3.创建bibernate.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.OracleDriver</property>
<!-- url地址 -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">Hibernate</property>
<property name="connection.password">orcl</property>
<!-- SQL dialect (SQL 方言) -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--在控制台打印后台的SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化显示SQL -->
<!-- <property name="format_sql">true</property> -->
<!-- 自动生成表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 关联小配置 -->
<mapping resource="cn/a/entity/Dept.hbm.xml" />
<mapping resource="cn/a/entity/Emp.hbm.xml" />
</session-factory>
</hibernate-configuration>
1.4编写测试类oneTomanyTest
@Test
public void onetomany()
{
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//构建一个部门
Dept dept=new Dept();
dept.setDeptName("就業部");
//构建一个员工
Emp emp=new Emp();
emp.setEmpName("彪哥");
//指定员工所隶属的部门
emp.setDept(dept);
dept.getSets().add(emp);
//save()
session.save(dept);
//提交事务
tx.commit();
HibernateUtil.CloseSession();
}
补充:inverse属性和cascade属性
inverse:决定是否把对象中集合的改动反映到DB中,所以inverse只对集合起作用,也只有one-to-many和many-to-many有效,因为只有这两种关系有集合(而many-to-one和one-to-one只含有关系对方的一个引用)。
cascade:决定是否把对象的改动反映到DB中,所以,cascade对所有的关联关系都起作用。
2:inverse:inverse所描述的是对象之间关联关系的维护方式。
inverse:只存于集合标记的元素中。
inverse的作用是:把对象中对集合的改动反映到DB中
inverse的默认值是:false,表示集合的改动反映到DB中,inverse:false为主动方,由主动方负责维护关联关系。
inverse为true:表示不将改动过的集合反映到数据库中。
一对多:该属性在多的一方。应在少的一方设置inverse属性:true,而多的一方设置为false,这说明关联关系由多的一方来维护,如果
要少的一方维护,就会使插入或删除时一方去update多的一方每一个与这个对象有关系的对象,如果交给多的一方来维护,则会大大提高
了效率(因为关系就是在多的一方中,直接插入或删除就好了嘛)
多对多:属性存在独立表中。inverse属性默认为false;在多对多的关系中,关系两端的inverse不能都设置为false,如果都设置为false,则在插入操作时会导致关系表中插入两 次关系,也不能都设置成true(任何操作都不会影响到关系表中的数据)
,因此在任意一方设置为true,另一方设置为false;
二.双向关联多对多
1.创建是实体类(Emp,Project)
public class Emp {
private Integer eid;
private String ename;
private Set<Project> pros=new HashSet<Project>();
public Integer getEid() {
return eid;
}
public void setEid(Integer eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Set<Project> getPros() {
return pros;
}
public void setPros(Set<Project> pros) {
this.pros = pros;
}
}
/*
* 项目实体类
*/
public class Project {
private Integer pid;
private String pname;
private Set<Emp> emps=new HashSet<Emp>();
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
2.编写配置文件
Emp.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.a.entity">
<class name="Emp" table="Emp">
<id name="eid">
<generator class="native">
</generator>
</id>
<property name="ename"></property>
<set name="pros" table="EmpPro">
<key column="eid"></key> <!-- 多的一方的外建 -->
<many-to-many class="Project" column="pid"/>
</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.a.entity">
<class name="Project" table="Project">
<id name="pid">
<generator class="sequence">
<param name="sequence">SEQ_Student</param>
</generator>
</id>
<property name="pname"></property>
<set name="emps" table="EmpPro">
<key column="pid"></key> <!-- 多的一方的外建 -->
<many-to-many class="Emp" column="eid"/>
</set>
</class>
</hibernate-mapping>
3.创建大配置文件
<?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.OracleDriver</property>
<!-- url地址 -->
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">Hibernate</property>
<property name="connection.password">orcl</property>
<!-- SQL dialect (SQL 方言) -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<!--在控制台打印后台的SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化显示SQL -->
<!-- <property name="format_sql">true</property> -->
<!-- 自动生成表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 关联小配置 -->
<mapping resource="cn/a/entity/Project.hbm.xml" />
<mapping resource="cn/a/entity/Emp.hbm.xml" />
<!--<mapping resource="cn/a/entity/Dept.hbm.xml" />
<mapping resource="cn/a/entity/Emp.hbm.xml" /> -->
</session-factory>
</hibernate-configuration>
4.编写测试类
@Test
public void manyTomanyTest()
{
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//构建一个部门
Project pro=new Project();
pro.setPname("技术部");
//构建一个员工
Emp emp=new Emp();
emp.setEname("迟明洋");
//指定员工所隶属的部门
emp.getPros().add(pro);
pro.getEmps().add(emp);
//save()
session.save(pro);
session.save(emp);
//提交事务
tx.commit();
HibernateUtil.CloseSession();
}
运行结果Oracle数据库端

Hibernate关联映射关系的更多相关文章
- (转)Hibernate关联映射——对象的三种关系
http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...
- Hibernate关联映射(转载)
原文:http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.html 以简单的两个类为例: User(int id, String name) ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- 【SSH】Hibernate关联映射
一对一关联映射 一对一主键关联映射 一句话:不加字段.主键既是主键又是外键. 一对一单向主键关联映射 配置: <span style="font-family:KaiTi_GB2 ...
- Hibernate关联映射(多对一 --- many-to-one)
转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9 Hibernate的关联映射关系有 ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053. Hibernate关联映射上接Hibernate持久化类:h ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
随机推荐
- 微信 小程序 canvas
测试手机为IPHONE6,开发者工具版本0.10.102800.开发者工具0.11.112301版本也一样 微信小程序里的canvas 非 h5 canvas有很多不一样的地方,以下把微信小程序的ca ...
- javascript的浅拷贝和深拷贝
1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据. 2.深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制. 这里画一个简单的图来加深理解: ...
- TimeUnit 使用
TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段 主要作用 时间颗粒度转换 延时 常用的颗粒度 TimeUnit.DAYS //天 TimeUnit. ...
- 关于插件管理器Alcatraz
如何安装插件管理器Alcatraz:去github下载一个Alcatraz安装包,然后运行一下. 会弹出 记得选择左边的Load Bundle 退出Xcode 重新运行一下就OK 了. 然后就可以看到 ...
- iOS本地推送与远程推送
原文在此 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程 ...
- UITableView传值(自己使用)(属性,代理传值)
今天有些匆忙. 效果图如下: 代码如下: #import <UIKit/UIKit.h> #import "FirstViewController.h" @interf ...
- 委托 C#
这些就是自己的理解. 委托的用处就是把方法传递给其他方法. 1委托的使用更类差不多,也 是需要先定义再实例化. 2Action<T>和Func<T>委托 3多播委托 4.匿名方 ...
- 自定义标签 与 JSTL(JSP Standard Tag Library)
1.自定义标签 [理解] [1]简介 > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %> ...
- Third glance in Go
在Go語言裏關於數組(Array),切片(Slice)和映射表(Map)的使用是非常常見的.有過其他語言編程背景的人會比較熟悉一下,但是也是因爲過於的熟悉,從而導致一個慣性思維,往往就會踢到“石頭”, ...
- mysql源码解读之配置文件
要研究mysql,最好的资源莫过于源码了,所以本人打算通过调试源码的方式来深入理解mysql的点点滴滴.搭建mysql调试环境很简单,从官方下载mysql源码,利用cmake工具生成工程即可.为了方便 ...