hibernate之关联映射
No.1
映射一对多双向关联关系:
当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象。
步骤一:
注意:hibernate要求在持久化类中定义集合类属性时,必须把属性类型设置为接口类型(如:java.util.Set)
优点:声明接口类型可以提高持久化类型的透明性,当hibernate调用setEmp()时,传递的参数是hibernate自定义的该接口的类的实例,
如果把setEmp()设置成java.util.HashSet,就强迫hibernate只能把HashSet类的实例作为参数传递。
例:
javabean
public class Department {
private Integer id;
private String name;
private Set<Employee> employees=new HashSet<Employee>();
@Override
public String toString() {
return "Department [id=" + id + ", name=" + name +"]";
}
//get,set方法省略.....
}
☆定义Employee类
public class Employee {
private Integer id;
private String name;
private Department dept;
//get,set方法省略.....
}
这样可以提高程序的健壮性,避免应用程序访问取值为null的Emp集合而抛出的空指针异常,因为该集合不为null。
步骤二:
编写hbm.xml配置文件
1.
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity">
<class name="Dept" table="DEPT">
<id name="did" type="int" column="DID">
<generator class="native">
</generator>
</id>
<property name="name" type="string" column="NAME"/>
<set name="set" cascade="save-update" inverse="true">
<key column="deptNo"></key> <!-- key:这里是多的一方定义的外键 -->
<one-to-many class="Emp"/> <!-- 多的一方的实体类型 -->
</set>
</class>
</hibernate-mapping>
2.
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="entity">
<class name="Emp" table="EMP">
<id name="eid" type="int" column="EID">
<generator class="native">
</generator>
</id>
<property name="ename" type="string" column="ENAME"/>
<many-to-one name="dept" class="Dept" column="deptNo"></many-to-one>
</class>
</hibernate-mapping>
<set>元素包含以下属性:
1)name:设定待映射的持久化类的属性名,这里为dept类的set属性。
2)cascade:当取值为“save-update",表示级联保存和更新。
<set>元素还包含两个子元素:<key>和<one-to-many>,<one-to-many>元素设定所关联的持久化类,此处为Dept类,<key>元素
设定与所关联的持久化类对应的表的外键(也就是多的一方定义的外键)。
而hibernate从此配置获取以上信息:
*<set>元素表明emp集合:类型为java.util.Set
*<class>子元素表明emp集合中存放的一组emp对象。
*<key>子元素表明emp通过deptNo参照dept表。
*cascade属性取值“save-update“,表明当保存更新dept时,会级联保存或更新Emp集合中的数据!
步骤三:
大配置如下:
<?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">Y2162</property>
<property name="connection.password">1</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> --> <!-- 自动生成student表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 关联小配置 -->
<mapping resource="entity/Emp.hbm.xml" />
<mapping resource="entity/Dept.hbm.xml" />
<!-- <mapping class="cn.happy.entity.Grade"/> --> </session-factory>
</hibernate-configuration>
步骤四:编写测试类
public static void one()
{
Dept de=new Dept();
Emp em=new Emp();
Session session = ElectronicUtil.getSession();
Transaction tx = session.beginTransaction();
de.setName("运维部");
em.setEname("发哥");
em.setDept(de);
de.getSet().add(em);
session.save(de);
tx.commit();
System.out.println("success");
session.close();
}
一对多双向关联完成!!!!!
浅谈cascade和inverse
1:首先明确cascade和inverse的作用:
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;
No.2 多对多双向关联
步骤一: 实体类的创建
public class Employee implements java.io.Serializable {
// Fields
private Integer empid;
private String empname;
private Set<Project> projects = new HashSet<Project>();
...其他内容省略
}
02.创建Project持久化类
public class Project implements java.io.Serializable {
private Integer proid;
private String proname;
private Set<Employee> employees = new HashSet<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="cn.happy.daymanymany.Employee" table="EMPLOYEE">emploee
<id name="empid" type="java.lang.Integer">
<column name="EMPID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="empname" type="java.lang.String">
<column name="EMPNAME" length="32" not-null="true" />
</property>
<set name="projects" inverse="true" table="PROEMP">promp
<key column="REMPID"/><!-- 表PROEMP的外键REMPID -->
<many-to-many class="cn.happy.daymanymany.Project" column="RPROID" />
</set>
</class>
</hibernate-mapping>
<?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="cn.happy.daymanymany.Project" table="PROJECT">
<id name="proid" type="java.lang.Integer">
<column name="PROID"/>
<generator class="sequence">
<param name="sequence">SEQ_ID</param>
</generator>
</id>
<property name="proname" type="java.lang.String">
<column name="PRONAME" length="32" not-null="true" />
</property>
<set name="employees" table="PROEMP" cascade="save-update">
<key column="RPROID" />
<many-to-many class="cn.happy.daymanymany.Employee" column="REMPID" />
</set>
</class>
</hibernate-mapping>
通过第三张表的外键关联两个类的多对多关系
大配置同上:步骤三:编写测试类
public void addTest(){
Emp emp=new Emp();
emp.setEmpname("大美丽");
Project pro=new Project();
pro.setPname("中央支援地方");
pro.getEmps().add(emp);
emp.getPros().add(pro);
session.save(pro);
session.save(emp);
}
hibernate之关联映射的更多相关文章
- Hibernate注解----关联映射注解以及课程总结详解----图片版本
上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...
- Hibernate的关联映射——双向1-N关联
Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...
- Hibernate的关联映射——单向1-N关联
Hibernate的关联映射--单向1-N关联 单向1-N关联的持久化类里需要使用集合属性.因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现.从这个意义上来看,1-N(实际上还包括N ...
- Hibernate的关联映射——单向1-1关联
Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...
- Hibernate的关联映射——单向N-1关联
Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- 初识Hibernate之关联映射(二)
上篇我们介绍了关联映射的几种形式,有单向多对一,单向一对多,还有双向一对多.本篇接着介绍有关关联映射的其他几种映射方式,主要有以下几种: 基于外键的单向一对一关联映射 基于主键的单向一对一关联映射 单 ...
- Hibernate的关联映射关系
一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...
- 关于Hibernate的关联映射
何为关联映射 由于数据库的表与表之间存在的管理关系,可以分为一对一,一对多和多对多关联,一般情况下,在数据库设计中是通过表的外键来建立各种关系的,在Hibernate中则把数据库表与表之间的关系数据映 ...
- Hibernate框架--关联映射,一对多,多对多 inverse cascade
回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...
随机推荐
- SAP查询事务、表属于哪个模块
这个功能主要是在汇报SAP的产品问题时,让你知道该选择你所汇报的问题所哪个子模块的.它可以依据事务代码.表.程序名.域.数据元素来查找. 方法:SE38,执行报表程序:RSSTATUS .
- sharepoint2010问卷调查(1)-实现问卷的图片调查(采用JS实现)
1. 首先建立个图片库上传图片 2. 采用:评估范围(一系列选项或 Likert 范围)制作,如下图: http://win-i07fillcfom:8003/DocLib2/1.jpg http ...
- 国内最全最详细的hadoop2.2.0集群的MapReduce的最简单配置
简介 hadoop2的中的MapReduce不再是hadoop1中的结构已经没有了JobTracker,而是分解成ResourceManager和ApplicationMaster.这次大变革被称为M ...
- APP One Link ,android and ios qrcode merge as One QRCode and one short link
Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...
- Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.解决办法
Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...
- 一组PHP可逆加密解密算法
对于大部分密码加密,我们可以采用md5.sha1等方法.可以有效防止数据泄露,但是这些方法仅适用于无需还原的数据加密. 对于需要还原的信息,则需要采用可逆的加密解密算法. 下面一组PHP函数是实现此加 ...
- Mac OS X 删除文件快捷键
今天发现自己还不知道怎么快捷的删除文件,网上找了下相关的资料. 原来删除文件的快捷键是:command+delete(把文件放到废纸篓),对于我这种笔记本用户,确实方便很多哈 还有一个命令也挺有用的: ...
- DOM样式操作
CSS 到 DOM的抽象 通过操作 CSS 对应的 DOM对象来更新CSS样式 换肤操作 如何获取实际的样式(不仅有行内,更有页面和外联样式表中定义的样式) 样式表分为三类: 外联,页面,行内 内部样 ...
- (翻译) TFS源代码控制的未来 (TFSVC vs. Git)
说明:由于博客园的限制,之前转发的MVP卢建晖的文章不能放入首页,但我会继续转发,感兴趣的同学请到我的博客首页查看. 博主: 翻译自微软Visual Studio ALM产品组老大Brian Harr ...
- Javascript之旅——终点站:困惑的settimeout
有时候结局不是很美好,但起码这也算是一种结局,这个系列的最后一篇settimeout,这是一个让人困惑的函数,也是我一直在吐槽JS的 原因,我们看不到JS的源代码,setimeout同样也是,从始到终 ...