版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵州省黔东南州2025-2026学年高一上学期10月月考地理试卷(有答案)
- 2025-2026学年宁夏回族自治区石嘴山一中高一(上)月考物理试卷(1月份)(含答案)
- 食用菌母种制作工岗位技能考试试卷及答案
- 杀菌锅操作工岗位技能考试试卷及答案
- 数据库专用服务器合同
- 海藻繁育工岗前基础技能考核试卷含答案
- 道路客运服务员安全宣贯考核试卷含答案
- 梳理热风非织造布制作工风险评估与管理能力考核试卷含答案
- 2026年师德师风知识竞赛测试题库(含标准答案)
- 草坪园艺师道德测试考核试卷含答案
- 《水对地表的作用》教学设计-2026-2027学年教科版五年级科学上册
- 老旧小区改造工程监理细则
- 2026新教材统编版九年级上册历史:全册教材问题答案
- 2026烟草制品购销员(四级)考试复习题库(含答案)
- 管道焊前预热及焊后热处理(PWHT)施工组织设计方案
- 2026-2030中国外侧上髁炎(网球肘)行业市场发展趋势与前景展望战略分析研究报告
- 《钎焊》课件 第10、11章 无机非金属材料的钎焊;工具钢、钛合金及难熔合金的钎焊
- 学校肺结核宣传教育
- 中国人寿:养老险总公司招聘笔试题库2026
- 法人委托授权管理流程及模板
- 酒店总经理面试题目与评分标准
评论
0/150
提交评论