收藏 分销(赏)

传智播客hibernate.ppt

上传人:天**** 文档编号:1777092 上传时间:2024-05-09 格式:PPT 页数:50 大小:470.50KB
下载 相关 举报
传智播客hibernate.ppt_第1页
第1页 / 共50页
传智播客hibernate.ppt_第2页
第2页 / 共50页
传智播客hibernate.ppt_第3页
第3页 / 共50页
传智播客hibernate.ppt_第4页
第4页 / 共50页
传智播客hibernate.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、高级软件人才实作培训专家高级软件人才实作培训专家!最佳实践 l见hibernate参考文档1.高级软件人才实作培训专家高级软件人才实作培训专家!Hibernate原理与应用讲师讲师:李勇2.高级软件人才实作培训专家高级软件人才实作培训专家!主要内容1.引入2.安装配置3.基本概念和CURD4.HQL和Criteria5.关联映射6.继承映射7.集合映射8.懒加载9.缓存10.事务11.其他12.Hibernate不适合的场景13.与JPA的集成(annotation方式)14.最佳实践3.高级软件人才实作培训专家高级软件人才实作培训专家!引入l模型不匹配(阻抗不匹配)Java面向对象语言,对象

2、模型,其主要概念有:继承、关联、多态等;数据库是关系模型,其主要概念有:表、主键、外键等。l解决办法1使用JDBC手工转换。2使用ORM(ObjectRelationMapping对象关系映射)框架来解决,主流的ORM框架有Hibernate、TopLink、OJB。4.高级软件人才实作培训专家高级软件人才实作培训专家!安装配置l下载地址http:/www.hibernate.org,本教程使用3.2.5。l将下载目录/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:antlr.jar,cglib.jar,asm.jar,commons-co

3、llections.jar,commons-logging.jar,jta.jar,dom4j.jar5.高级软件人才实作培训专家高级软件人才实作培训专家!安装配置l配置文件hibernate.cfg.xml和hibernate.properties,XML和properties两种,这两个文件的作用一样,提供一个即可,推荐XML格式,下载目录/etc下是示例配置文件。可以在配置文件指定:数据库的URL、用户名、密码、JDBC驱动类、方言等。启动时Hibernate会在CLASSPATH里找这个配置文件。l映射文件(hbm.xml,对象模型和关系模型的映射)。在/eg目录下有完整的hibern

4、ate示例。l快速开始小例子6.高级软件人才实作培训专家高级软件人才实作培训专家!基本概念和CURD开发流程1由Domainobject-mapping-db。(官方推荐)2由DB开始,用工具生成mapping和Domainobject。(使用较多)3由映射文件开始。7.高级软件人才实作培训专家高级软件人才实作培训专家!基本概念和CURDDomainObject限制1.默认的构造方法(必须的)。2有无意义的标示符id(主键)(可选)3非final的,对懒加载有影响(可选)DomainJavaObject(User)publicclassUserprivateintid;privateStrin

5、gname;privateDatebirthDay;/getter setter8.高级软件人才实作培训专家高级软件人才实作培训专家!基本概念和CURD1.hbm.xml主键生成器,参考文档P655.1.42.详细详细信息信息见见参考文档参考文档P629.高级软件人才实作培训专家高级软件人才实作培训专家!基本概念和CURDJava代代码码1.初始化代初始化代码码(只做一次只做一次)Configuration cfg=new Configuration();cfg.configure(“config.cfg.xml”);也可以通过cfg.setProperty设置属性。SessionFactor

6、y sessionFactory=cfg.buildSessionFactory();2.模板代模板代码码Session session=null;Transaction tx=null;trysession=sessionFactory.openSession();tx=session.beginTransaction();/你的代码save,delete,update,mit();catch(Exception e)if(tx!=null)tx.rollback();throw e;finallyif(session!=null)session.close();10.高级软件人才实作培训专

7、家高级软件人才实作培训专家!基本概念和CURDlSession的几个主要方法1.save,persist保存数据,persist在事务外不会产生insert语句。2.delete,删除对象3.update,更新对象,如果数据库中没有记录,会出现异常。4.get,根据ID查,会立刻访问数据库。5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。7.lock(把对象变成持久对象,但不会同步对象的状态)。11.高级软件人才实作培训专家高级软件人才实作培

8、训专家!对象状态l瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。l持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久持久对对象状象状态发态发生生改改变变,在事,在事务务提交提交时时会影响到数据会影响到数据库库(hibernate能能检测检测到到)。l脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;托管对象状态发生改变,hibernate不能检测到。12.高级软件人才实作培训专家高级

9、软件人才实作培训专家!对象状态13.高级软件人才实作培训专家高级软件人才实作培训专家!HQL和CriteriaHQL(Hibernate Query Language)HQL(Hibernate Query Language)面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作,Query的创建方式:Queryq=session.createQuery(hql);lfromPersonlfromUseruserwhereuser.name=:namelfromUs

10、eruserwhereuser.name=:nameanduser.birthday:birthdayCriteriaCriteriaCriteria是一种比HQL更面向对象的查询方式;Criteria的创建方式:Criteriacrit=session.createCriteria(DomainClass.class);简单属性条件如:criteria.add(Restrictions.eq(propertyName,value),criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName)14.高级软件人才实作培训

11、专家高级软件人才实作培训专家!基本功能练习实现实现实现实现UserDaoUserDaopublicinterfaceUserDaopublicvoidsaveUser(Useruser);publicUserfindUserById(intid);publicUserfindUserByName(Stringname);publicvoidupdateUser(Useruser);publicvoidremove(Useruser);15.高级软件人才实作培训专家高级软件人才实作培训专家!基本功能练习实验实验实验实验步步步步骤骤骤骤:1.设计domain对象User。2.设计UserDao接口

12、。3.加入hibernate.jar和其依赖的包。4.编写User.hbm.xml映射文件,可以基于hibernate/eg目录下的org/hibernate/auction/User.hbm.xml修改。5.编写hibernate.cfg.xml配置文件,可以基于hibernate/etc/hibernate.cfg.xml修改;必须提供的几个参数:connection.driver_class、connection.url、connection.username、connection.password、dialect、hbm2ddl.auto。6.编写HibernateUtils类,主要用

13、来完成Hibnerate初始化和提供一个获得Session的方法;这步可选。7.实现UserDao接口。16.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射l多对一(Employee-Department)l一对多(Department-Employee)l一对一(room-door)l多对多(teacher-student)l组件映射(User-Name)l集合映射(set,list,map,bag)linverse和cascade(EmployeeDepartment)17.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射多多多多对对对对一一一一(Employee-D

14、epartment)(Employee-Department)映射文件ER图18.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射一一一一对对对对多多多多(Department-Employee)(Department-Employee)19.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射一一一一对对对对一一一一(Person-IdCard)(Person-IdCard)1)基于主键的one-to-one(person的映射文件)idCard20.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射一一一一对对对对一一一一(Person-IdCard)(Person

15、-IdCard)2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应21.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射多多多多对对对对多多多多(teacher-student)(teacher-student)在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。22.高级软件人才实作培训专家高级软件人才实作培训专家!关联映射组组组组件映射件映射件映射件映射(User-Nam

16、e)(User-Name)关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。当组件的属性不能和表中的字段简单对应的时候可以选择实现:org.hibernate.usertype.UserType或org.hibernate.usertype.CompositeUserType23.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射对象模型(Java类结构)24.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射一个一个一个一个类继类继类继类继承体系一承体系一承体系一承体系一张张张张表表表表(subclass)(subclass

17、)(表表表表结结结结构构构构)25.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射一个一个一个一个类继类继类继类继承体系一承体系一承体系一承体系一张张张张表表表表(subclass)(subclass)(映射文件映射文件映射文件映射文件)26.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射每个子每个子每个子每个子类类类类一一一一张张张张表表表表(joined-subclass)(joined-subclass)(表表表表结结结结构构构构)27.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射每个子每个子每个子每个子类类类类一一一一张张张张表表表表(joined

18、-subclass)(joined-subclass)(映射文件映射文件映射文件映射文件)28.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射混合使用混合使用混合使用混合使用“一个一个一个一个类继类继承体系一承体系一承体系一承体系一张张表表表表”和和和和“每个子每个子每个子每个子类类一一一一张张表表表表”(”(表表表表结结构构构构)29.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射混合使用混合使用混合使用混合使用“一个一个一个一个类继类继承体系一承体系一承体系一承体系一张张表表表表”和和和和“每个子每个子每个子每个子类类一一一一张张表表表表”(”(映射文件映射文件映射

19、文件映射文件)30.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射每个具体每个具体每个具体每个具体类类类类一一一一张张张张表表表表(union-subclass)(union-subclass)(表表表表结结结结构构构构)31.高级软件人才实作培训专家高级软件人才实作培训专家!继承映射每个具体每个具体每个具体每个具体类类类类一一一一张张张张表表表表(union-subclass)(union-subclass)(映射文件映射文件映射文件映射文件)主健不能是identity类型,如果父类是abstract=”true”就不会有表与之对应。隐式多态,映射文件没有联系,限制比较多很少使用

20、。32.高级软件人才实作培训专家高级软件人才实作培训专家!集合映射集合映射集合映射集合映射集合映射(set,list,array,bag,map)(set,list,array,bag,map)!-!-33.高级软件人才实作培训专家高级软件人才实作培训专家!集合映射集合映射集合映射集合映射集合映射(set,list,array,bag,map)(set,list,array,bag,map)!表中有单独的整型列表示list-index!表中有单独的整型列表示list-index34.高级软件人才实作培训专家高级软件人才实作培训专家!集合映射集合映射集合映射集合映射集合映射(set,list,a

21、rray,bag,map)(set,list,array,bag,map)35.高级软件人才实作培训专家高级软件人才实作培训专家!集合映射集合映射集合映射集合映射集合映射(set,list,array,bag,map)(set,list,array,bag,map)l这些集合类都是Hibernate实现的类和JAVA中的集合类不完全一样,set,list,map分别和JAVA中的Set,List,Map接口对应,bag映射成JAVA的List;这些集合的使用和JAVA集合中对应的接口基本一致;在在JAVA的的实实体体类类中集合只能定中集合只能定义义成接口不能定成接口不能定义义成具体成具体类类,

22、因为集合会在运行时被替换成Hibernate的实现。l集合的集合的简单简单使用原使用原则则:大部分情况下用set,需要保证集合中的顺序用list,想用java.util.List又不需要保证顺序用bag。36.高级软件人才实作培训专家高级软件人才实作培训专家!集合映射cascadecascade和和和和inverseinverse(Employee Department)(Employee Department)lCasade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade:none,all,save-update,delete,lock,refresh

23、,evict,replicate,persist,merge,delete-orphan(one-to-many)。一般对many-to-one,many-to-many不设置级联,在和中设置级联。linverse表“是否放弃是否放弃维护维护关关联联关系关系”(在Java里两个对象产生关联时,对数据库表的影响),在one-to-many和many-to-many的集合定义中使用,inverse=”true”表示该对象不维护关联关系;该属性的值一般在使用有序集合时设置成false(注意hibernate的缺省值是false)。one-to-many维护关联关系就是更新外键。many-to-man

24、y维护关联关系就是在中间表增减记录。注:配置成one-to-one的对象不维护关联关系37.高级软件人才实作培训专家高级软件人才实作培训专家!懒加载通过asm和cglib二个包实现;Domain是非final的。1.session.load懒加载。2.one-to-one(元素)懒加载:必需同时满足下面三个条件时才能实现懒加载(主表不能有constrained=true,所以主表没有懒加载)lazy!=false2)constrained=true3)fetch=select3.one-to-many(元素)懒加载:1)lazy!=false2)fetch=select4.many-to-on

25、e(元素):1)lazy!=false2)fetch=select5.many-to-many(元素):1)lazy!=false2)fetch=select6.能够懒加载的对象都是被改写过的代理对象,当相关联的session没有关闭时,访问这些懒加载对象(代理对象)的属性(getId和getClass除外)hibernate会初始化这些代理,或用Hibernate.initialize(proxy)来初始化代理对象;当相关联的session关闭后,再访问懒加载的对象将出现异常。38.高级软件人才实作培训专家高级软件人才实作培训专家!缓存缓存的作用主要用来提高性能,可以简单的理解成一个Map;

26、使用缓存涉及到三个操作:把数据放入缓存、从缓存中获取数据、删除缓存中的无效数据。一级缓存,Session级共享。save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。39.高级软件人才实作培训专家高级软件人才实作培训专家!缓存二级缓存,SessionFactory级共享。l实现为可插拔,通过修改cache.provider_class参数来改变;hibernate内置了对EhCache,OSC

27、ache,TreeCache,SwarmCache的支持,可以通过实现CacheProvider和Cache接口来加入Hibernate不支持的缓存实现。l在hibernate.cfg.xml中加入:或在映射文件的class元素加入子元素:其中usage:read-only,read-write,nonstrict-read-write,transactionallSession的:save(这个方法不适合native生成方式的主键),update,saveOrUpdate,list,iterator,get,load,以及Query,Criteria都会填充二级缓存,但只有(没打开查询缓存时

28、)Session的iterator,get,load会从二级缓存中取数据(iterator可能存在N+1次查询)。lQuery,Criteria(查询缓存)由于命中率较低,所以hibernate缺省是关闭;修改cache.use_query_cache为true打开对查询的缓存,并且调用query.setCacheable(true)或criteria.setCacheable(true)。lSessionFactory中提供了evictXXX()方法用来清除缓存中的内容。l统计信息打开generate_statistics,用sessionFactory.getSatistics()获取统计

29、信息。40.高级软件人才实作培训专家高级软件人才实作培训专家!缓存l分布式缓存和中央缓存。l使用缓存的条件1.读取大于修改。2.数据量不能超过内存容量。3.对数据要有独享的控制。4.可以容忍出现无效数据。41.高级软件人才实作培训专家高级软件人才实作培训专家!事务JDBCTransactionJDBCTransaction单个数据库(一个SesisonFactory对应一个数据库),由JDBC实现。Sessionsession=null;Transactiontx=null;trysession=sessionFactory.openSession();tx=session.beginTran

30、saction();/mit();catch(HibernateExceptione)if(tx!=null)tx.rollback();throwe;finallyif(session!=null)session.close();connection.setAutoCommit(false);mit();conn.rollback();42.高级软件人才实作培训专家高级软件人才实作培训专家!事务JTATransactionJTATransaction可以简单的理解成跨数据库的事物,由应用JTA容器实现;使用JTATransaction需要配置hibernate.transaction.fac

31、tory_class参数,该参数缺省值是org.hibernate.transaction.JDBCTransactionFactory,当使用JTATransaction时需要将该参数改成org.hibernate.transaction.JTATransactionFactory,并配置jta.UserTransaction参数JNDI名(Hibernate在启动JTATransaction时要用该值到JNDI的上下文Context中去找javax.transaction.UserTransaction)。javax.transaction.UserTransactintx=context

32、.lookup(“jndiName”);trytx.begin();/多个数据库的session操作;/session1./mit();catch(Exceptione)tx.rollback();throwe;43.高级软件人才实作培训专家高级软件人才实作培训专家!事务lsessioncontext和事务边界用current_session_context_class属性来定义context(用sessionFactory.getCurrentSession()来获得session),其值为:1.thread:ThreadLocal来管理Session实现多个操作共享一个Session,避免

33、反复获取Session,并控制事务边界,此时session不能调用close当commit或rollback的时候session会自动关闭(connection.release_mode:after_transaction)。Opensessioninview:在生成(渲染)页面时保持session打开。2.jta:由JTA事务管理器来管理事务(connection.release_mode:after_statement)。l悲观锁和乐观锁悲观锁由数据库来实现;乐观锁hibernate用version和timestamp来实现44.高级软件人才实作培训专家高级软件人才实作培训专家!其他问题l

34、hibernate.cfg.xml和hbm.xml内容解释l数据类型1.type可以是hibernate、java类型或者你自己的类型(需要实现hibernate的一个接口)。2.基本类型一般不需要在映射文件(hbm.xml)中说明,只有在一个JAVA类型和多个数据库数据类型相对应时并且你想要的和hibernate缺省映射不一致时,需要在映射文件中指明类型(如:java.util.Date,数据库DATE,TIME,DATATIME,TIMESTAMP,hibernate缺省会把java.util.Date映射成DATATIME型,而如果你想映射成TIME,则你必须在映射文件中指定类型)。3.

35、数据类型的对应关系见参考文档5.2.2lSession是非线程安全的,生命周期较短,代表一个和数据库的连接,在B/S系统中一般不会超过一个请求;内部维护一级缓存和数据库连接,如果session长时间打开,会长时间占用内存和数据库连接。lSessionFactory是线程安全的,一个数据库对应一个SessionFactory,生命周期长,一般在整个系统生命周期内有效;SessionFactory保存着和数据库连接的相关信息(user,password,url)和映射信息,以及Hibernate运行时要用到的一些信息。45.高级软件人才实作培训专家高级软件人才实作培训专家!其他问题lflush时将

36、一级缓存与数据库同步l大批处理大量操作数据时可能造成内存溢出,解决办法如下:1.清除session中的数据for(inti=0;i100000;i+)session.save(obj);for(inti=0;i100000;i+)session.save(obj);if(i%50=0)session.flush();session.clear();2.用StatelessSession接口:它不和一级缓存、二级缓存交互,也不触发任何事件、监听器、拦截器,通过该接口的操作会立刻发送给数据库,与JDBC的功能一样。StatelessSessions=sessionFactory.openState

37、lessSession();该接口的方法与Session类似。3.Query.executeUpdate()执行批量更新,会清除相关联的类二级缓存(sessionFactory.evict(class),也可能会造成级联,和乐观锁定出现问题46.高级软件人才实作培训专家高级软件人才实作培训专家!其他问题lHQL1查询多个对象selectart,userfromArticleart,Useruserwhereart.author.id=user.idandart.id=:id这种方式返回的是Object,Object0:article,Object1:user。2分页query.setFirst

38、Result,query.setMaxResults.查询记录总数query.iterate(“selectcount(*)fromPerson”).next()3批量更新query.executeUpdate()可能造成二级缓存有实效数据。lCriteria1排序Criteria.addOrder(Order.desc(propertyName);2关联查询criteria.setFetchMode(“propertyName”,FetchMode.SELECT)与映射文件中关联关系的fetch作用一致。3投影Projections.rowCount(),max(propertyName),

39、avg,groupProperty4分页Projections.rowCount(),criteria.setFirstResult(),criteria.setMaxResults()5DetachedCriteria可在session外创建(在其他层创建比如在Service中创建)然后用getExecutableCriteria(session)方法创建Criteria对象来完成查询。6Example查询,Example.create(obj);criteria.add(example)。47.高级软件人才实作培训专家高级软件人才实作培训专家!其他问题lN+1次查询和懒加载1.用Query

40、.iterator可能会有N+1次查询。2.懒加载时获取关联对象。3.如果打开对查询的缓存即使用list也可能有N+1次查询。l拦截器与事件拦截器与事件都是hibernate的扩展机制,Interceptor接口是老的实现机制,现在改成事件监听机制;他们都是hibernate的回调接口,hibernate在save,delete,update等会回调这些类。lSQL和命名查询l用Map代替Domain对象;将对象转化为XML。48.高级软件人才实作培训专家高级软件人才实作培训专家!Hibernate不适合的场景l不适合OLAP(On-LineAnalyticalProcessing联机分析处理

41、),以查询分析数据为主的系统;适合OLTP(on-linetransactionprocessing联机事务处理)。l对于些关系模型设计不合理的老系统,也不能发挥hibernate优势。l数据量巨大,性能要求苛刻的系统,hibernate也很难达到要求,批量操作数据的效率也不高。49.高级软件人才实作培训专家高级软件人才实作培训专家!与JPA的集成(annotation方式)l需要添加的包ejb3-persistence.jar,hibernate-entitymanager.jar,hibernate-annotations.jar,hibernate-commons-annotations

42、.jar,jboss-archive-browsing.jar,javassist.jarl配置文件%CLASSPATH%/META-INF/persistence.xmllJAVA代码:EntityManagerFactoryemf=Persistence.createEntityManagerFactory(name);/(Name:在persistence.xml中指定。)EntityManagerem=emf.createEntityManager();EntityTransactiontx=em.getTransaction();Tx.begin();Em.persist(entity);/remove,merge,findTmit();Em.close();Emf.close();50.

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服