版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate今天的主要内容是:--hibernate的知识!HibernatesessionHibernatePO(Transient)newSession关联(session管理(DetachedOID准备Hibernate工程的环境:(建立包 导入开发jar包(12个,将Hibernate.cfg.xml、perties到src,修改Hibernate.cfg.xmljdbchibernateUtils工具类。hbm<?xml<?xmlversion="1.0"encoding="UTF-<!DOCTYPEhibernate-DTD"配置映射 po和表的映射<class .a_postate.Customer"主键<idname="id"主键策略<generator其他属性<property<property 编写测试类,////publicvoidCustomerc=newCustomer();System.out.println("Sessionsession=HibernateUtils.openSession();////此时的Customer对象,存在了持久化的标识了(oid),与关联,数据库存在对应记录了(临时表中//System.out.println("}}System.out.println("脱管态po在三个状态的情况下是否是同一个对象看看对象的内容Customer注意一点:脱管态的时候,sessionsession关联就是持久态)sessionoidoididCustomeroid那么两者的区别(加上扩展区别oidid如何直接获得newsave、saveOrUpdate转换到-setIdOID持久化标识(id是数据库中存在的)(不是规----sessionget、load、createQuery、delete(closeSessionevict、clearSession-----转换到瞬时态----OID设置为null,或者手动将数据库的对应的数据删掉updatesaveOrUpdatelock(Session关联session中存在的,就是持久化对象,不存在的就是瞬时或脱管对象。session瞬时态对象-nnyyyny三者区别小结便于的方法(不一定完全准确saveupdate的就是脱管sessionSessionSession销毁后,集合(map)销毁,一级缓存释放!只要是持久态对象缓存作用:将数据缓存到内存或者硬盘上,这些数据,直接从内存或硬盘加载数据,junitpublicvoidSessionsessionHibernateUtils.openSession();//发生了:Customercustomer=(Customer)session.get(Customer.class,23);//发生了:这个动作,将customer这个po放入一级缓存中了Customercustomer2=(Customer)session.get(Customer.class,23);//发生了:,并不从数据库查询(sql语句)}SessionsessionSessionsessionHibernateUtils.openSession();//发生了:创建一级缓存,PO对象(但,connection)Customercustomer=(Customer)session.get(Customer.class,23);//发生了:这个动作,customerpo放入一级缓存中了Customercustomer2=(Customer)session.get(Customer.class,23);//发生了:,并不从数据库查询(sql语句) Sessionsession2HibernateUtils.openSession();//发生了:创建一级缓存,但是一级缓存中没有PO对象(但,至少缓存了connection)Customercustomer3=(Customer)session2.get(Customer.class,23);//发生了:这个动作,将customer这个po放入一级缓存中了Customercustomer4=(Customer)session2.get(Customer.class,23);//发生了:,并不从数据库查询(sql语句)举例提示PO对象的属性.无法手动更改快照.hibernate自己可以更改快照.(直接见下面的例子publicvoidtestSnapshot()SessionsessionHibernateUtils.openSession发生了:创建一级缓存,PO对象(但,connection)与快照做比较,不一样则发出update语句更新数据库}sessionflush查询操作//publicvoidtestFlushFirstCacheAndSnapshort()SessionsessionHibernateUtils.openSession发生了:创建一级缓存,PO对象(但,connection)Customercustomer=(Customer)session.get(Customer.class,23);//po,po//PO对象的属性//flushsession.getTransaction().commit包含flush:先flush}}flushcommitflush是发语句的;commit的是数据库层面的是否保存更改的数据,问题:能否改变一级缓存的刷出时间?答案是可以的auto//publicvoidtestFlushFirstCacheAndSnapshort()SessionsessionHibernateUtils.openSession发生了:创建一级缓存,PO对象(但,connection) Customercustomer=(Customer)session.get(Customer.class,23);//po,po//PO对象的属性 session.getTransaction().commit()包含flush:先flush////手动flush}}当一级缓存发生变化时,即和快照不同时,刷出一级缓存,会自数据库提交update语////Customerc=(Customer)session.get(Customer.class,(session关联的另一层含义就是一级缓存中存在)publicvoidtestFirstCacheOP()SessionsessionHibernateUtils.openSession发生了:创建一级缓存,PO对象(但,connection)Customercustomer=(Customer)session.get(Customer.class,23);//po,posql语句Customer}Customercustomer3=(Customer)session.get(Customer.class,23);//po,poCustomercustomer4=(Customer)session.get(Customer.class,24);//po,poCustomercustomer1=(Customer)session.get(Customer.class,23);//po,poCustomercustomer2=(Customer)session.get(Customer.class,24);//po,poreflesh:重新刷新一级缓存中指定的对象(sql语句,flush有相反的感Customerinsertnative(identityidentitysavesql语句(insert),id,无需等sequence,,save之后,会立刻id的那个语句.,仅仅是当提交的时候,才insert语句.案例演示:oraclemysql////Customerc=newCustomer();sqlsql。Customerc=newCustomer();OIDid////持久态的oidCustomerc=newCustomer();报错原因就是:在一级缓存中,oid是用来标识唯一对象的,如果你能改了的话,hibernate就不知道这个对象是谁了,所以,hibernate不允许改变持久化对象的id.这里补充一个方法:JPA规,提供persist方法,作用和save类似!可以通用//jpa的//jpa的Customerc=newCustomer();//idCustomercnewCustomer();//瞬时//session.update(c);//此时没有发出sqlID;update解id了////使用持久态中存在的id//Customerc2=(Customer)session.get(Customer.class,//更新id为5CustomercnewCustomer();//瞬时如果更新成功了:idOID重复了,这是new一个再更新(不要使用脱管对象更新)。ID更新不存在的IDCustomercnewCustomer();//////问题:Customerc=(Customer)session.get(Customer.class,5);session.update(c);//update,其实都会更新。因此,对于持update。update主要是用在非持久态的对象的更新。OIDsessiongetload方法区别getget方法后,立即查询,返回目标对象实例load()会延迟加载getloadidCustomerc2=(Customer)session.load(Customer.class, }publicvoidSessionsession=HibernateUtils.openSession();Customerc1=(Customer)session.get(Customer.class23);//立即发出sql通过断点调试查看load方法的延迟加载产生的子对C2的Customer的子对象handlerinitializedtrue(已经初始化,target指向真正查询GetgetSQLLoadloadSQLid的目标对象代理子类对象,在对象除id外其他属性时SQL(id在数据库中不存在的时候可能会发生ObjectNotFoundException)load//// id之外的元素的时候,都发出////如果数据库不存在该idgetnullload会报错:补充:子对象是负责生成HibernatedeleteIDpublicvoidtestDelete()Sessionsession=HibernateUtils.openSession();Customerc=(Customer)session.get(Customer.class,25);Customerc2=newCustomer();}两者有区别么?(单表看不出来,多表可以看出来(()一对一:一个公司对应一个地址(一个人员的基本信息会对应一个扩展信息)(订单表id多对多:一定产生第关系表,需要三张表(学生表、课程表、选课表,关HibernateORMhibernate编程,可以完成类和表映射一对多://Set<Order>orders}Order//Customercustomer}Student//Set、ListSet<Cource>cources}Cource//Set<Student>students}{//Address} //;}我们下面重点学对多和多对多hbm中的多表映射关系配置的一个原则(便于建立一个包用于测试:cn.hbm>po和表的映射<class .hb.b_onetomany.Order"主键<idname="id"主键策略<generator<generator<property<many-to-one >>po和表的映射<class 主键<idname="id"主键策略<generator<property配置关系:-对多的一方先配置集合<setkey:<keyclass<one-to-many>建表成功建表成功本节难点:cascadeinverse外键双向关publicvoidSessionsession=HibernateUtils.openSession();Customercustomer=newCustomer();OrderordernewOrder();}这种保存要求:必须双方都建立关系,而且都要执行保存操作级hibernatesession.flushcascadesave操作,变为持久态,update操作,变为持久态如果通过操作customer来级存order,需要在Customer.hbm.xml(谁是持久的)配置级使用级联之后,save操作问题:分析:先操作order,级存customer,需要在Order.hbm.xml配置级sql语句,//publicvoidSessionsession=HibernateUtils.openSession();Customerc=newCustomer();Ordero1newOrder();Ordero2=newOrder();o2.setName("洗衣机o3.setName("洗衣机////分别产生几条插入session.save(o1);//}Ordero3=Ordero3=new)customer////删除多方,比如:3Ordero=new(订单////删除1方:如1Customerc=newHibernate(not-null)问题:从关系型数据库的角度来说:在一对多数据模型中,多方对一方存在依赖的,如果cascade=”delete”会级联删除Customercustomer=(Customer)session.get(Customer.class,32);Customercustomer1=newCustomer();--------hbmCustomerc=(Customer)session.get(Customer.class,Ordero=(Order)session.get(Order.class,Customerc=(Customer)session.get(Customer.class,Ordero2=newOrder();实际项目开发中一般级联主要是用来级联删除用的很少用来级存实际业务中,前提:现有一方数据了,那如何保存多方数据呢?一般我们也会用多方去关联一方的脱管(1OrderOrderonewOrder();Customerc=newCustomer(); 扩展(作业外键的问题-问题:sql的问题//////查询1Customerc=(Customer)session.get(Customer.class,//查询1OrderOrdero=(Order)session.get(Order.class,inverse简单的说这个属性谁是true,就放弃了主键权inverse默认值是false,即双方都有主键权inverseone-to-manymany-to-many有效在业务开发中,一般是在一方放弃(1,再存多方,那么一般,我们都让1方放弃外键权权,在父方配置(一方配置客户inverse=true,将外键权交给多方。所以,一般,级联和放弃外所以,一般,级联和放弃外 的配置都放在一方配置级联、外键面试题:inversecascade的区别(cascade操作的是记录级联的层面,inverse操作的是外//inverse和cascadepublicvoidSessionsession=HibernateUtils.openSession();Customerc=newOrdero=new}CascadeInverseinverse=true在多对多中,一般情况没必要使用cascadehbm只要是多对一的,都配置自己在对方的外键属性pu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冀少版八年级生物上册第三、四、五章整合练课件
- 企业商务接待规范指南
- 人力资源合规风险防范成本分析
- 北京市礼品合同
- 智能化印刷生产施工合同
- 电力系统升级施工合同范本
- 畜牧业用地租赁合同
- 社区义工活动策划与实施
- 交响乐团指挥聘任合同
- 教育信息化项目投标保证金办法
- 我家乡-湖北钟祥教学课件
- 地球仪与地图七年级上册 科学知识精讲与典例提升 (浙教版)
- 国家职业类别1-6类明细表
- 三级医院急诊科护理质量评价标准
- 小学、幼儿园与属地卫生医疗部门联动机制集合9篇
- 2023春国开电大《实用管理基础》形考任务1-4参考答案
- 工商银行全国地区码
- 纤支镜检查知情同意书
- 企业介绍PPT模板
- 社保信息变更申请表模板
- 动土作业安全培训考试
评论
0/150
提交评论