chapter6 Hibernate的关联映射
回顾
· 下面这个异常是怎么回事?该怎么解决?
org.hibernate.MappingException: Unknownentity: com.aptech.jb.entity.TblUser
atorg.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:514)
atorg.hibernate.event.def.DefaultLoadEventListener.onLoad (DefaultLoadEventListener.java:66)
atorg.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
atorg.hibernate.impl.SessionImpl.get(SessionImpl.java:799)
atcom.aptech.jb.dao.hibimpl.TblUserDAO.findById(TblUserDAO.java:52)
atcom.aptech.jb.Test.main(Test.java:13)
没有在Hibernate.cfg.xml加
<mappingresource="com/aptech/jb/entity/TblUser.hbm.xml" />
预习检查
1、举一个一对多关联的例子
2、举一个多对一关联的例子
3、举一个多对多关联的例子
4、使用Hibernate配置关联有什么好处?
本章任务
· 使用Hibernate实现:
· 配置Hibernate关联自动加载区县对应的街道
· 配置Hibernate关联并实现:
1、增加一个区县:“山南区”
2、增加山南区下属的三个街道
3、删除“五四大道”
4、划“和平路”到海淀区
5、删除山南区
· 配置Hibernate多对多关联,实现某OA系统项目和人员对照关系的管理
本章目标
· 掌握单向many-to-one关联
· 掌握双向one-to-many关联
· 掌握many-to-many关联
实体间的关联
单向多对一关联
小结
· 在租房系统中,房屋信息(Fwxx)与用户(User)间也是多对一关系。如何配置映射文件,使之可以通过下面的代码输出房屋信息和发布该信息的用户名称?
Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);
System.out.println( fwxx.getTitle() + ","
+ fwxx.getUser.getUname());
双向一对多关联
· 现希望通过qx.getJds()即可获得该区县下所有街道的信息。如何配置映射信息?
<!-- Qx类映射文件 - ->
<classname="Qx" table="TBL_QX">
<id name="qxid"column="qxid" type=“java.lang.Long">
<generatorclass="native" />
</id>
<property name="qxname"column="qx" type="java.lang.String"/>
<set name="jds" >
<key column="qxid" />
<one-to-many class="Jd" />
</set>
</class>
在Qx映射文件中增加set/one-to-many配置
public class Qx{
private Integer qxid;
private String qxname;
private Set jds =
new HashSet();
// Getters & Setters ...
}
双向一对多关联
· 测试程序
Qx qx = (Qx)super.get(Qx.class,1);
System.out.println(qx.getQxname());
Iterator it = qx.getJds().iterator();
while (it.hasNext()) {
Jdjd = (Jd)it.next();
System.out.print(jd.getJdname()+ " ");
}
现在我们在“区县”(一)和“街道”(多)两方面都添加了关联,获得了双向一对多的配置
可以只在一的一方配置,从而得到单向一对多关联
· 在配置好双向一对多后,如何实现下列功能?
1、增加一个区县:“山南区”
2、增加山南区下属的三个街道:“和平路”、“八一路”和“五四大道”
3、删除“五四大道”
4、划“和平路”到海淀区
5、删除山南区
· 增加一个区县:山南区
在many一方添加数据
· 在many一方删除数据的正确做法:
· 给配置文件中set属性增加inverse属性,设为true
(由many一方负责维护关联)
· 程序代码:
// 在对象模型中删除关系
Jd jd =(Jd)super.get(Jd.class,366);
Qx qx =(Qx)super.get(Qx.class,19);
qx.getJds().remove(jd);
// 在数据库中删除数据
super.del(Jd.class,366);
//BaseHibernateDAO中del方法代码
Transaction tx= null;
try {
tx = session.beginTransaction();
session.delete(this.get(clazz,id));
tx.commit();
} catch(RuntimeException re) {
tx.rollback();
throw re;
}
修改关联关系
· 划“和平路”到海淀区
在one一方删除数据
· 删除山南区
· 删除山南区应级联删除下属的区县
· set节点之cascade属性
· all : 对所有操作都进行级联
· none : 对所有操作都不进行级联
· save-update : 执行更新操作时级联
· delete : 执行删除操作时级联
小结
· 在租房系统中,房屋信息(Fwxx)与用户(User)是多对一关系;房屋信息(Fwxx)与街道(Jd)是多对一关系
请完成下面的方法,完成添加“房屋信息”记录到数据库的功能
/**
* 新建房屋信息记录
* @param title 房屋信息标题
* @param fwxx 房屋信息内容
* @param userId 用户ID
* @param jdId 街道ID
*/
public voidpost(String title,String fwxx,int userId,int jdId){
//TODO:完成这个方法。
}
many-to-many关联
· 多对多关系怎么映射呢?
<class name="Project"table="project" >
<set name="members" table="r_emp_proj">
<key column="r_proj_id" />
<many-to-many
class="com.aptech.jb.entity.Employee"column="r_emp_id" />
</set>
</class>
<class name="Employee"table="employee" >
...
<set name="projects" table="r_emp_proj" inverse="true">
<key column="r_emp_id" />
<many-to-many
class="com.aptech.jb.entity.Project"column="r_proj_id" />
</set>
</class>
many-to-many关联
· 编码解决下列问题:
1、新招聘了员工:三叔,加入到国家局供应链项目
2、新立项项目:中教集团网银项目,三叔和胖子参加
3、无敌维护组项目结束,Tod和Hanni退出项目组
总结
· 如何配置单向多对一关联?
· 如何配置单向一对多关联?
· 如何配置双向一对多关联?
· inverse属性的含义是什么?
cascade属性的含义是什么
总结
1.配置hibernate,导入包,如果和其他包有冲突,优先使用高版本的。
2.hibernate.cfg.xml基本配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/HibernateConfiguration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<propertyname="connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
<propertyname="connection.url">jdbc:sqlserver://localhost:1433;databasename=zf</property>
<property name="connection.username">KingWay</property>
<propertyname="connection.password">feiduit123,.</property>
<propertyname="diglect">org.hibernate.SQLServerDiglect</property>
<propertyname="show_sql">true</property>
<propertyname="format_sql">true</property>
<mappingresource="entity/FWLX.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3.表关系
many-to-one
首先在实体类中加入对方对象,写GETTER和SETTER方法,在配置文件中加入<many-to-one name="fwlx"class="entity.FWLX" column="lxid" ></many-to-one>如果列名column在前面出现,就需要加入insert="false" update="false"。可以使用对象的属性调用出对应的列值
one-to-many
首先在实体类中加入对方的set集合,写GETTER和SETTER方法,在配置文件中加入<setname="fwxxs" lazy="true"table="TBL_FWXX"><key column="lxid"></key><one-to-many class="entity.FWXX" /></set>,对set集合进行操作,获取对方的对应的列值
如果要从2个主键和外键表中取值,一般是获取一方对象对多方进行操作进行操作。为了节省数据库资源,省却不必要的update语句,我们一般建议在一对多双向关联关系中,将一方的inverse属性设置为true,即将主外键的关系交由多方来维护。使用多方的对象维护数据,节约系统性能。只要是set都加上inverse="true",多对多除外
cascade属性all : 对所有操作都进行级联none : 对所有操作都不进行级联save-update : 执行更新操作时级联delete: 执行删除操作时级联
many-to-many,通过中间表实现,中间表不用建立实体类
在2个类中都加入对方的set集合,写Getter和Setter方法,不能写成eId的形式,获取不了getter方法,配置文件中加入<set name="pros" inverse="true" table="r_emp_proj" ><key column="r_emp_id"></key><many-to-manyclass="entity.Project"></many-to-many></set>其中table是中间表名,class是对方的类,column是自己的外键。inverse设在不需要经常更新的那个many里面
4.数据库用户映射对应的数据库如果打勾,不用登陆也可以执行SQL语句
5. hibernate三个准备添加Hibernate 库 ,添加Hibernate 配置文件,添加对应表的实体类和映射文件
6.hibernate七个步骤
Configuration conf = newConfiguration().configure();//1、读取配置文件
SessionFactory sf =conf.buildSessionFactory();// 2、创建SessionFactory
Session session = sf.openSession();// 3、打开Session
Transaction tx = null;
try{
tx = session.beginTransaction();// 4、开始一个事务
// 5、持久化操作
User user = new User();
user.setUname("Hibernate user");
user.setUpass("password");
session.save(user);
tx.commit();// 6、提交事务
}catch(Exception e){
if (null!=tx){tx.rollback();}
e.printStackTrace();
}finally{
session.close();// 7、关闭Session
chapter6 Hibernate的关联映射相关推荐
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- Hibernate的关联映射--一对多、
这是我 1 单向一对多: 实体类:(课程类)Grade与(学生类)Student的一对多关系 学生类: public class Student implements java.io.Serializ ...
- 8 Hibernate:关联映射(Associations)
Hibernate 关联映射(Associations)分为: 8.1 Hibernate:一对一关联映射 8.1.1 Hibernate:一对一单向关联(unidirectional) ...
- Hibernate一对一关联映射配置
一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1)保 ...
- Hibernate之关联映射
在现实生活中 ,很少有对象是孤立存在的,例如老师,往往和被授课的学生存在关联关系,如果得到了某个老师实例,那么我们就可以直接获取该老师 对应的全部学生.同样,我们得到了一个学生实例 ,我们也可以获取 ...
- [置顶] Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- [置顶] Hibernate从入门到精通(十一)多对多双向关联映射
上次我们在中Hibernate从入门到精通(十)多对多单向关联映射讲解了一下多对多单向关联映射,这次我们讲解一下七种映射中的最后一种多对多双向关联映射. 多对多双向关联映射 按照我们之前的惯例,先看一 ...
- Hibernate(九)一对多双向关联映射
上次的博文Hibernate从入门到精通(八)一对多单向关联映射中,我们讲解了一下一对多单向映射的相关 内容,这次我们讲解一下一对多双向映射的相关内容. 一对多双向关联映射 一对多双向关联映 射,即在 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
最新文章
- windows socket编程入门示例3
- 用fieldset标签轻松实现Tab选项卡效果
- Share memory中bank conflict问题
- windows下编译firefox
- ANSI C typedef
- 剑指offer面试题[15]-链表中倒数第K个结点
- 性能测试中容易混淆的概念
- 人脸表情识别从0到部署,猜猜『轮到你了』的微笑狼人到底是谁!
- TongWeb部署Dm数据库的项目报错
- 计算机xp系统恢复以前设置,如何设置xp系统一键还原
- PDCA循环和GTD时间管理
- Xperf 使用方法
- QQ音乐、网易云音乐、酷狗音乐歌单导入到Spotify
- 第三届传智杯初赛A组G题 - 森林
- 计算机2级选择题及答案,计算机二级Office模拟试题及答案
- 报错解决:AttributeError: ‘Word2VecKeyedVectors‘ object has no attribute ‘save_Word2Vec_format‘
- selenium的安装和下载谷歌浏览器镜像驱动
- 删除U盘上的EFI分区
- Management By Objectives - MBO - 目标管理
- win2003遭受udp攻击导致带宽占用很大