您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 黑马程序员:三大框架11天笔记全之hibernate-day06笔记
黑马程序员郑州中心编著黑马程序员:三大框架hibernate-day06笔记第1章Hibernate持久化类与主键生成策略1.1Hibernate持久化类什么是持久化类?PersistentObject(PO)PO=POJO+hbm映射配置对于hibernate中的PO编写规则:1.必须提供一个无参数的public构造方法2.所有属性要private,对外提供public的get/set方法3.在PO类必须提供一个标识属性,让它与数据库中的主键对应,我们管这个属性叫OID4.PO类中的属性尽量使用基本数据类型的包装类.Int-Integerdouble--Doublefloat-Float5.PO类它不能使用final修饰符OID作用:OID指的是与数据库中表的主键对应的属性。Hibernate框架它是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,那么hibernate认为它们是同一个对象。黑马程序员郑州中心编著为什么PO类属性它要使用包装类型?使用基本数据类型是没有办法去描述不存在概念,如果使用包装类型,它就是一个对象,对于对象它的默认值是null.PO类不可以使用final修饰?(hibernate中的get/load方法的区别)Get/load方法它们都是根据id去查询对象。1.get直接得到了一个持久化类型对象,它就是立即查询操作load它得到的是持久化类开的代理类型对象(子类对象)。它采用了一种延迟策略来查询数据。2.get方法在查询时,如果不存在返回nullload方法在查询时,如果不存在,会产生异常ObjectNotFoundException.1.2Hibernate主键生成策略Hibernate中定义的主键类型包括:自然主键和代理主键:自然主键:具有业务含义字段作为主键,比如:学号、身份证号代理主键:不具有业务含义字段作为主键(例如自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串黑马程序员郑州中心编著建议:企业开发中使用代理主键!主键生成器描述increment代理主键。由hibernate维护一个变量,每次生成主键时自动以递增。问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。优点:可以方便跨平台缺点:不适合高并发访问identity代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。如果数据库支持自增建议采用。优点:由底层数据库维护,和hibernate无关缺点:只能对支持自动增长的数据库有效,例如mysqlsequence代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。如果数据库支持序列建议采用。优点:由底层数据库维护,和hibernate无关缺点:数据库必须支持sequence方案例如oraclenative代理主键。根据底层数据库对自动来选择identity、sequence、hilo由于生成主键策略的控制权由hibernate控制,所以不建议采用。优点:在项目中如果存在多个数据库时使用缺点:效率比较低uuid代理主键。Hibernate采用128bit位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和黑马程序员郑州中心编著数据库平台的无关性。建议采用。优点:与数据库无关,方便数据库移植,效率高,不访问数据库就可以直接生成主键值,并且它能保证唯一性。缺点:uuid长度大(32位),占用空间比较大,对应数据库中类型charvarcharassigned自然主键。由java程序负责生成标识符。不建议采用。尽量在操作中避免手动对主键操作第2章Hibernate持久化对象状态2.1持久化对象三种状态有三种:1.瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernatesession无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。简单说:无OID与数据库中的信息无关联,不在session管理范围内。2.持久态:在hibernatesession管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。简单说:有OID由session管理,在数据库中有可能有,也有可有没有。黑马程序员郑州中心编著3.托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。对于托管态对象,它发生改变时hibernet不能检测到。2.2持久化类三种状态切换判断持久化类对象三种状态:1.是否有OID2.判断是否与session关联黑马程序员郑州中心编著1.瞬时态(new出来的)瞬时------持久savesaveOrUpdate瞬时-----脱管(游离)手动设置oid2..持久态它是由session管理持久-------瞬时delete()被删除后持久化对象不在建议使用持久-----脱管注意:session它的缓存就是所说的一级缓存evict(清除一级缓存中指定的一个对象)clear(清空一级缓存)close(关闭,清空一级缓存)3..脱管态(它是无法直接获取)脱管-----瞬时直接将oid删除黑马程序员郑州中心编著脱管----持久updatesaveOrUpdatelock(过时)第3章Hibernate一级缓存Hibernate的一级缓存就是指session缓存。actionQueue它是一个行列队列,它主要记录crud操作的相关信息persistenceContext它是持久化上下文,它其实是真正缓存。在session中定义了一系列的集合来存储数据,它们构成session缓存。只要session没有关闭,它就会一直存在。当我们通过hibernate中的session提供的一些API例如savegetupdate等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),就不会去从数据库查询,而是直接从缓存中获取。Hibernate的一级缓存存在的目的就是为了减少对数据库访问。在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。黑马程序员郑州中心编著3.1示例---演示一级缓存的存在3.2持久化对象具有自动更新数据库能力为什么持久化对象具有自动更新数据库能力?黑马程序员郑州中心编著3.3一级缓存常用API一级缓存特点:1.当我们通过session的save,updatesaveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。2.当我们通过session的load,get,Query的list等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。3.当调用session的close方法时,session缓存清空。clear清空一级缓存.evict清空一级缓存中指定的一个对象。refresh重新查询数据库,用数据库中信息来更新一级缓存与快照黑马程序员郑州中心编著3.4Hibernate常用API-Session补充3.4.1updateudpate操作它主要是针对于脱管对象,持久对象具有自动更新能力。问题1:如果我们直接操作的对象是一个脱管对象,执行update会出现什么情况?Update操作时,如果对象是一个脱管对象,可以操作,它会将脱管对象转换成持久对象在操作如果在session中出现相同的oid两个对象,会产生异常问题2脱管对象的oid如果在数据表中不存在,会报异常?所以:在操作中,建议我们通过持久化对象来直接修改其操作。3.4.2saveOrUpdate如果对象是一个瞬时对象--------执行save操作如果对象是一个脱管对象---------执行update如果是一个持久对象-------直接返回黑马程序员郑州中心编著3.4.3delete删除一个脱管对象,与session关联,在删除注意:如果执行delete操作,先删除一级缓存,在删除数据库中的数据。第4章Hibernate关联映射--数据对象三种关系Hibernate框架基于ORM设计思想,它将关系型数据库中的表与我们java中的类进行映射,一个对象就对应着表中的一条记录,而表中的字段对应着类中的属性。数据库中表与表之间存在着三种关系,也就是系统设计中的三种实体关系4.1一对一原则有两种:1.唯一外键对应:在任意一方添加外键来描述对应关系2.主键对应:一方的主键作为另一方的主键黑马程序员郑州中心编著ClassEmployee{PrivateArchivesarchives;}ClassArchives{PrivateEmployeeemployee;}4.2一对多(多对一)客户与订单之间一对多关系(多对一)建表原则:在多的一方添加外键来描述关联关系黑马程序员郑州中心编著ClassCustomer{PrivateSetOrderorders;}ClassOrder{PrivateCustomerc;}4.3多对多例如学生与老师建表原则:通过一张中间表来描述其对应关系黑马程序员郑州中心编著ClassStudent{SetTeacherts;}ClassTeacher{SetStudentss;}第5章Hibernate关联映射--一对多(多对一)我们以客户(Customer)与订单(Order)为例黑马程序员郑州中心编著5.1实体类创建5.1.1订单5.1.2客户黑马程序员郑州中心编著5.2Hbm映射文件编写5.2.1Order.hbm.xml5.2.2Customer.hbm.xml黑马程序员郑州中心编著5.3测试保存上面操作是一种双向关联问题:我们可不可以只保存订单或只保存客户完成保存操作?5.4测试单向关联保存org.hibernate.TransientObjectException:objectreferencesanunsavedtransientinstance-savethetransientinstancebeforeflushing:cn.itheima.oneToMany.Customer…………..这个异常代表提一个持久化对象关联了一个瞬时对象。黑马程序员郑州中心编著我们可以使用级联操作来解决上述的问题.我们现在要做的是保存订单时保存客户,需要在订单的hbm配置文件中修改设置cascade=save-update那么在保存订单时就可以自动将客户保存。如果我们要完成保存客户时,保存订单5.5双向关联维护我们在开发中要配置双向关联配置。---------可以通过任意一方来操作对方在操作代码,尽量来要进行单向关联。------可以尽量资源浪费。在双向关联中,会存在多余的update语句。我们可以使用inverse属性来设置,双向关联时由哪一方来维护表与表之间的关系。Inverse它的值如果为true代表,由对方来维护外键。Inverse它的值如果为false代表,由本方来维护外键。关于inverse的取值:黑马程序员郑州中心编著外键在哪一个表中,我们就让哪一方来维护外键。5.6对象导航5.7级联删除我们在删除客户时,也要删除订单,如果没有做级联,那么这个操作是不允许。为了维护数据完整性想要完成操作:我们可以在客户中添加cascade=”delete”;黑马程序员郑州中心编著delete-orphan用法5.8cascade总结使用cascade可以完成级联操作它可常用取值:none这是一个默认值save-update,当我们配置它时,底层使用saveupdate或save-upda
本文标题:黑马程序员:三大框架11天笔记全之hibernate-day06笔记
链接地址:https://www.777doc.com/doc-4225385 .html