|
2017-08-19 19:06:00
Hibernate4实战-独家视频教程-视频教程学习笔记 浏览(7559)|评论(4) 交流分类:学习问题讨论|笔记分类: 课程笔记
Hibernate是什么;ORMapping的原理 视频教程学习笔记
视频课程地址:Hibernate4实战-独家视频教程 当前播放的视频地址:Hibernate是什么;ORMapping的原理 hibernate是一个轻量级的ORM框架 框架:具有一定功能的半成品软件 轻量级:相对于重量级而言,走EJB等标准的javaEE规范的我们叫重量级,两者差别体现在对资源的耗费程度 对象实例->数据-ORM-数据<-数据库 类和表,实例和记录,属性和表字段映射 ORM的基本规则: 类和表: 一个类可以映射多个表,一个表可以映射多个对象 字段和字段: 类的属性字段的个数可以和表字段不一样 类的属性字段的顺序和表字段的顺序可以不一样 类的属性字段的类型可以和数据库中的字段类型不一样,但是必须能够转换 数据库的表里可以没有主键,但是对象里边需要设置主键字段. 数据库表之间的关系映射成为对象之间的关系 ORM的定义:把对象里边的数据和数据库里边的数据按照一定的规则进行映射的过程 ORM的基本实现方式是JDBC 原始的JDBC的所作所为: O:我们做 R:我们做 M:JDBC+手工写SQL Hibernate带来了什么:M 问题:Hibernate如何映射? 真正的映射关系只有程序员知道-->要让HIbernate知道方式就是配置(部署描述)-->XXX.cfg.xml和XXX.hbm.xml Hibernate有什么、能干什么和体系结构 笔记 Hibernate能干什么? 1.实现OR之间的Mapping->减少了JDBC+人工SQL处理数据的时间 2.屏蔽不同数据库的实现.能够平滑地在不同数据库之间进行移植 Hibernate的地位(图1) 1.Hibernate的地位位于Application和DataBase之间,今后,应用程序应该和Hibernate交互,而Hibernate和数据库交互,而Hibernate和数据库交互,应用程序不应该和数据库交互 2.应用程序与Hibernate之间通过持久化对象交互 3.Hibernate运行的时候需要配置文件,配置文件可以是properties,也可以是xml,其中xml进行映射描述 Hibernate运行时体系结构(图2) 1.Hibernate分成了5个部分 2.Hibernate会使用jdbc,jta,jndi等javaEE技术 3.Hibernate包含于Session相关的部分 4.应用程序和Hibernate交互,主要是通过Session接口 5.应用程序里面的对象==>称为瞬时对象 图3 1.进一步证实了,hibernate会使用JNDI,JDBC,JTA,而不是实现 2.Hibernate包含了3个大的部分:Session,Transaction,ConnectionProvider SessionFactory-->数据库,线程安全-->可以被缓存,可以在多线程环境下使用 当缓存数据时,需要非常清楚缓存中数据的潜在安全威胁。缓存中的数据可能会被别的进程访问或修改,而此进程对主数据是没有权限的。原因是当数据存储在原始位置时,有相应的安全机制来保护它,当数据被带出传统的安全边界时,需要有同等的安全机制。 Session-->数据库连接+操作对象 ==connection+statement/preparedStatement==>线程不安全,不应该被缓存 Transaction:事务对象 ConnectionProvider:生成JDBC连接的工厂,不稳定,直供测试,不建议使用在工程中 TransactionFactory:生成Transaction对象 Hibernate的HelloWorld第一部分 笔记 使用Hibernate,我们要做的事情: O:要做 R:要做 Mapping:映射的功能不做(这就是Hibernate要做的),我们要做的是映射的配置描述 Object不能是final的,原因是Hibernate的延迟装载的实现,使用的是动态代理的技术,动态代理不能代理final类 Hibernate的HelloWorld第二部分,分析HeloWorld的基本运行原理 笔记 SessionFactory sf = new Configuration().configure().buildSessionFactory();被标记为不推荐 ServiceRegisteryBuilder builder = new ServiceRegisteryBuilder().configure(); builder.applySettings("connection.driver_class","com.mysql.jdbc.Driver"); builder.applySettings("connection.url","jdbc:mysql:///test"); builder.applySettings("connection.username","root"); builder.applySettings("connection.password","root"); builder.applySettings("show_sql","true"); builder.applySettings("dialect","org.hibernate.dialect.MySQLInnoDBDialect"); MetadataSources sources = new MetadataSources(builder.buildServiceRegistery()); sources.addResource("cn/javass/h4/hello/UserModel.hbm.xml"); MetadataImpl metadata = (MetadataImpl)sources.buildMetadata(); SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory(); 由于ServiceRegisterBuilder实现不完整,不建议使用 推荐:Configuration cfg = new Configuration ().configure("hibernate.cfg.xml") cfg.buildSessionFactory(new ServiceRegiste ryBuilder().applySettings(cfg.getProperties).buildServiceRegistery()); 获取session: Session s = sf.openSession(); client: Transaction t =null; UserModel um = new UserModel(); um.setUuid("001"); um.setName("001N"); um.setAge(1); try{ t=s.beginTransaction(); s.save(um); t.commit(); }catch(Exception err){ err.printStackTrace(); t.rollback(); }finally{ s.close(); } 注意:save(um)方法存在的环境必须得是事务环境,若不是则save(um)不会发送相应的insert语句 简易的运行原理图 1.hibernate中存在着与session对应的一级缓存 2.TO:transient object:还没有进入到hibernate的缓存中,此时还在JVM中但是在hibernate之外 3.调用持久化方法可以将TO放入到一级缓存中 4.PO:放到Hibernate的一级缓存里面的对象 5.调用hibernate事务:commit方法将一级缓存中的持久化对象保存到数据库中 6.关闭session:session.close()并没有关闭持久化对象与数据库之间联系 Hibernate的集合性能;二级缓存 笔记 map,list,array都有一个key或index,在以key或index作为查询条件的查询操作时执行速度较快,所以对于需要以ID作为查询条件的方法的执行优选这些集合. bag既没有key也没有index,性能很差 set集合适合于复杂条件的查询操作(set没有记录元素的添加顺序,但是是有序的,所以某种程度上缩小了查询的区间) 当inverse为true的时候,往懒加载的集合中添加元素时,发送的SQL是select(检查该元素在数据库中是否已经存在)+insert(如果数据库中不存在该元素,则insert该元素的所有列到数据库中) 当inverse为false的时候,往懒加载的集合中添加元素时,发送的SQL是select(检查该元素在数据库中是否已经存在)+insert(如果数据库中不存在该元素,则insert该元素的除了外键列的所有列到数据库中)+update(将该元素的外键列由null赋值为关联值) 注意:一般调用懒加载集合的add或addAll方法会实例化该懒对象,但是也有例外:当inverse=true时,bag,list等懒加载集合调用add方法不会实例化自己! 使用Statistics检测性能: 第一步:在cfg.xml中配置hibernate.generate_statistics为true或通过sessionFactory.setStatisticsEnabled(true)或hibernateStatsBean.setStatisticsEnabled(true)来打开统计功能 第二步:使用Statistics接口的API Statistics API: ①关于Session的普通数据记录 ②实体,集合,查询,缓存相关的数据记录 二级缓存: 第一步:配置二级缓存(开启二级缓存) 配置属性:cache.region.factory_class=相应的缓存供应类全限定名 最常见的缓存供应策略类: EHCache:org.hibernate.cache.EhCacheProvider OSCache:org.hibernate.cache.OSCacheProvider 第二步:拷贝相应缓存策略供应商提供的jar包,在hibernate的lib/optional目录下 缓存映射: usage="transactional|read-write|nonstrict-read-write|read-only" region="RegionName" include="all|non-lazy"/> 1)usage说明了缓存的策略 2)region指定二级缓存的区域名 3)include:默认为all,当为non-lazy时,标记为lazy="true"的实体的属性可能无法被缓存 可以在hibernate.cfg.xml中指定和元素 缓存策略: ①read-only:只读取 ②read-write:可读写(并且可并发读写) ③nonstrict-read-write:可读写但不可并发读写,需要保证在session.close()或session.disconnect()调用前整个事务已经结束,(在JTA环境中使用该策略需要指定hibernate.transaction.manager_lookup_class属性) ④transactional:事务缓存,必须指定hibernate.transaction.manager_lookup_class属性 EHCache和OSCache对缓存策略的支持情况:不支持transactional策略,其他均支持 管理缓存: 一级缓存: 1.当save(),update()或saveOrUpdate()方法传递一个对象时或使用load(),get(),list()(list方法仅仅只是将数据加入缓存中,但并不会去使用缓存,它做的只是将数据加入缓存然后直接查询数据库),iterate()或scoll()方法获得一个对象时,该对象都将被加入到session的内部缓存中 2.当随后flush()方法被调用时,对象的状态会和数据库取得同步。但缓存中的数据仍然存在 3.Session还提供了一个contains方法用来判断某个实例是否处于当前session的缓存中 4.clear():将所有的对象从session缓存中清除 evit(o):将session中的o对象去掉 二级缓存: 与一级缓存的管理很相似,仅仅只是evit方法的参数需要注意: sf.evict(Cat.class,catId):清除特定的一个Cat的实例 sf.evict(Cat.class):清除所有的Cat的实例 sf.evictCollection("Cat.kittens",catId):清除catId对应的cat实例中的kittens集合实例 sf.evictCollection("Cat.kittens"):清除所有Cat的kittens集合实例 查询缓存(三级缓存):用来缓存查询结果,只有当经常使用相同的参数进行查询时,这才会有用处 1.配置hibernate.cache.use_query_cache=true 2.该设置会创建两个缓存区域 --①用于保存查询结果集的区域 --②另一个则用于保存最近查询的一系列的时间戳(org.hibernate.cache.UpdateTimestampsC ache). 注意:查询缓存,它并不缓存结果集中所包含实体的确切状态,它只缓存这些实体的标志符属性的值,以及各值类型的结果.所以查询缓存通常会和二级缓存一起使用。 3.绝大多数的查询并不能从查询缓存中受益所以hibernate默认是不进行查询缓存的。如果需要进行缓存,请调用Query.setQueryCacheable(true)方法。这个调用会让查询在执行过程中时先从缓存中查找结果,并将自己的结果集放到缓存中去。 二级缓存的配置:(若没有该配置文件就表示采用默认的配置) 第一步:配置ehcache.xml,配置到classpath下面,配置如下: maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> maxElementsInMemory:缓存最大数目 eternal:缓存是否持久 overflowToDisk:是否保存到磁盘,当系统当机时 timeToIdleSeconds:当缓存闲置n秒后销毁 timeToLiveSeconds:当缓存存活n秒后销毁 第二步:在hibernate.cfg.xml中设置: fal se true org.hibernate.cache.EhCacheRegionFactory 第三步:在hibernate.cfg.xml中设置需要缓存的类以及缓存策略 查询缓存的配置 第一步:配置ehcache.xml 第二步:在hibernate.cfg.xml中配置: true 第三步:在写程序的时候,还要设置Query的setCacheable(true) 精品视频课程推荐
透彻理解JavaBean视频教程
研磨设计模式——跟着cc学设计系列视频教程
深入浅出学Shrio视频教程
XML基础视频教程
深入浅出学Spring Web MVC视频教程
评论(4)
请登录后评论 登录
|