资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第六章,Hibernate,的关联映射,回顾,下面这个异常是怎么回事?该怎么解决?,org.hibernate.MappingException:Unknown entity:com.aptech.jb.entity.TblUser,at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:514),at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:66),at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862),at org.hibernate.impl.SessionImpl.get(SessionImpl.java:799),at com.aptech.jb.dao.hibimpl.TblUserDAO.findById(TblUserDAO.java:52),at com.aptech.jb.Test.main(Test.java:13),没有在,Hibernate.cfg.xml,加,回顾,下面代码有哪些错误?,Transaction tx=null;,Session session=HibernateSessionFactory.getSession();,try,tx=session.beginTransaction();,session.open();,session.insert(item);,session.close();,mit();,catch(Exception e),tx.rollback();,e.printStackTrace();,没有,session.open(),方法,session.save(item);,应该是,session.save(item);,应该先提交事务,再关闭,session,关闭,session,应在,finally,块中进行,预习检查,1,、举一个一对多关联的例子,2,、举一个多对一关联的例子,3,、举一个多对多关联的例子,4,、使用,Hibernate,配置关联有什么好处?,本章任务,使用,Hibernate,实现:,配置,Hibernate,关联自动加载区县对应的街道,配置,Hibernate,关联并实现:,1,、增加一个区县:“山南区”,2,、增加山南区下属的三个街道,3,、删除“五四大道”,4,、划“和平路”到海淀区,5,、删除山南区,配置,Hibernate,多对多关联,实现某,OA,系统项目和人员对照关系的管理,本章目标,掌握单向,many-to-one,关联,掌握双向,one-to-many,关联,掌握,many-to-many,关联,实体间的关联,单向多对一,单向一对多,tblJd.getQx().getQxname();,TblJd jd=(TblJd)tblQx.getJds().get(0);,jd.getJdname();,tblQx.getJds.add(jd);,实体间的关联,双向一对多,关系模型,怎样将实体一对多关系映射到数据库?,单向多对一关联,定义“区县”、“街道”实体如下:,映射文件:,public class Jd,private Integer jdid;,private String jdname;,private Qx qx;,/Getters&Setters.,public class Qx,private Integer qxid;,private String qxname;,/Getters&Setters.,多对一关系,只在,many,一方配置了关联,单向多对一关联,建立测试类,继承自,BaseHibernateDAO,public class ManyToOneTest extends BaseHibernateDAO,public static void main(String args),new ManyToOneTest().testManyToOne();,public void testManyToOne(),Jd jd=(Jd)super.get(Jd.class,1);,String qxname=jd.getQx().getQxname();,System.out.println(qxname+,+,jd.getJdname();,通过映射关系的配置即获得了在代码中面向对象编程的便利性!,通过配置,many-to-one,节点,,加载街道(多)信息时,Hibernate自动加载了对应的区县(一)信息,小结,在租房系统中,房屋信息(,Fwxx,)与用户(,User,)间也是多对一关系。如何配置映射文件,使之可以通过下面的代码输出房屋信息和发布该信息的用户名称?,Fwxx fwxx=(Fwxx)super.get(,Fwxx.class,1);,System.out.println(fwxx.getTitle()+,+fwxx.getUser.getUname();,双向一对多关联,现希望通过,qx.getJds(),即可获得该区县下所有街道的信息。如何配置映射信息?,public class Qx,private Integer qxid;,private String qxname;,private Set jds=,new HashSet();,/Getters&Setters.,在,Qx,实体类中,增加,jds,属性,在,Qx,映射文件中增加,set/one-to-many,配置,双向一对多关联,测试程序,Qx qx=(Qx)super.get(Qx.class,1);,System.out.println(qx.getQxname();,Iterator it=qx.getJds().iterator();,while(it.hasNext(),Jd jd=(Jd)it.next();,System.out.print(jd.getJdname()+);,现在我们在,“,区县,”,(一)和,“,街道,”,(多)两方面都添加了关联,获得了双向一对多的配置,可以只在一的一方配置,从而得到单向一对多关联,双向一对多关联,在配置好双向一对多后,如何实现下列功能?,1,、增加一个区县:“山南区”,2,、增加山南区下属的三个街道:“和平路”、“八一路”和“五四大道”,3,、删除“五四大道”,4,、划“和平路”到海淀区,5,、删除山南区,在,one,一方添加数据,增加一个区县:山南区,添加成功!,在,many,一方添加数据,增加山南区下属的三个街道:“和平路”、“八一路”和“,五四大道,”,在,many,一方删除数据,1,删除“五四大道”,根本没有执行,Delete,语句,数据没有被删除!,从,one,一方去“删除”,,Hibernate,只是执行了,update,语句。还是未删除成功!,问题出在配置文件上,没有配置,set,节点的,inverse,属性,inverse,是“反转”的意思,表示关联关系的控制权。,为,true,,表示由对方负责关联关系的添加和删除;,为,false,,表示由自己负责维护关联关系。,inverse,设为,true,,由,many,一方删除,执行了,delete,语句,删除成功,在,many,一方删除数据,2,在,many,一方删除数据的正确做法:,给配置文件中,set,属性增加,inverse,属性,设为,false,(由,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);,mit();,catch(RuntimeException re),tx.rollback();,throw re;,只执行,super.del,即可将数据从数据库中删除,但为了保持对象模型和数据库数据一致,还要调用,qx.getJds().remove(jd);,先从对象模型中删除,修改关联关系,划“和平路”到海淀区,首先对对象模型编码,然后个更新,hepinglu,(通过,inverse,属性设定的控制方),执行了,update,语句,在,one,一方删除数据,删除山南区,删除山南区应级联删除下属的区县,执行了,delete,语句,但违反外键约束,删除失败,super.del(365,Jd.class);,super.del(19,Qx.class);,?,如果,many,一方数据过多,代码繁琐,通过配置,set,节点,cascade,属性可,实现自动级联删除,先删除对应子表数据,,删除成功!,在,one,一方删除数据,set,节点之,cascade,属性,all :,对所有操作都进行级联,none :,对所有操作都不进行级联,save-update:,执行更新操作时级联,delete :,执行删除操作时级联,代码,自动执行了级联删除,小结,在租房系统中,房屋信息(,Fwxx,)与用户(,User,)是多对一关系;房屋信息(,Fwxx,)与街道(,Jd,)是多对一关系。,请完成下面的方法,完成添加“房屋信息”记录到数据库的功能。,/*,*,新建房屋信息记录,*,param title,房屋信息标题,*,param fwxx,房屋信息内容,*,param userId,用户,ID,*param jdId,街道,ID,*/,public void post(String title,String fwxx,int userId,int jdId),/TODO,:完成这个方法。,many-to-many,关联,Hanni,Tod,胖子,王筝,国家局供应链项目,奴吉亚(中国),Go-Direct,销售系统,无敌维护组,某,OA,系统要解决如下业务问题:,1,、业务部门为项目式管理,2,、每个人参与一个或多个项目;每个项目由一个或多个人完成,3,、系统需要如下功能:,a.,列出项目的参加人员,b.,列出某个人参加的所有项目,many-to-many,关联,数据库设计,project,和,employee,是多对多关系,需要建立一个关系表,many-to-many,关联,多对多关系怎么映射呢?,.,指定关联表的名称,关联表中外键的字段名,使用,many-to-many,节点配置,关联表中对应外键的字段名,根据业务规则,设置其中一方,inverse,为,true,程序代码,many-to-many,关联,编码解决下列问题:,1,、新招聘了员工:三叔,加入到国家局供应链项目。,2,、新立项项目:中教集团网银项目,三叔和胖子参加。,3,、无敌维护组项目结束,,Tod,和,Hanni,退出项目组。,many-to-many,关联,新招聘了员工:三叔,加入到国家局供应链项目。,新立项项目:中教集团网银项目,三叔和胖子参加。,无敌维护组项目结束,,Tod,和,Hanni,退出项目组。,总结,如何配置单向多对一关联?,如何配置单向一对多关联?,如何配置双向一对多关联?,inverse,属性的含义是什么?,cascade,属性的含义是什么?,总结,使用,Hibernate,,通过简单的配置即可获得对象间关联的能力
展开阅读全文