chapter6 Hibernate的关联映射
来源:互联网 发布:美国地缘政治知乎 编辑:程序博客网 时间:2024/05/29 04:48
回顾
· 下面这个异常是怎么回事?该怎么解决?
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 的关联映射
- Hibernate的关联映射
- hibernate的关联映射
- Hibernate的关联映射
- Hibernate的关联映射
- Hibernate的关联映射
- Hibernate的关联映射,数据表的关联
- Hibernate的关联关系映射
- Hibernate的关联关系映射
- Hibernate的关联关系映射
- Hibernate的关联关系映射
- Hibernate的关联关系映射
- Hibernate的映射关联关系
- hibernate关联关系的映射
- Hibernate的映射(关联)
- Hibernate 的关联关系映射
- C++容器使用经验总结(一)
- 深入Java虚拟机JVM类加载初始化学习
- 双向链表 , 添加 , 得到上层结构体地址
- I/O学习 --
- UML中的stereotype
- chapter6 Hibernate的关联映射
- 黑马程序员_repeater分页实现
- Redis 起步
- 设计模式解析与实现(C++)之Factory模式
- linxu __setup 宏
- 八款开源 Android 游戏引擎 (巨好的资源)
- C# 获取当前路径方法
- Oracle 字符集的查看和修改
- android:shape的使用