hibernate配置.ppt

上传人:小飞机 文档编号:5433137 上传时间:2023-07-06 格式:PPT 页数:41 大小:1.72MB
返回 下载 相关 举报
hibernate配置.ppt_第1页
第1页 / 共41页
hibernate配置.ppt_第2页
第2页 / 共41页
hibernate配置.ppt_第3页
第3页 / 共41页
hibernate配置.ppt_第4页
第4页 / 共41页
hibernate配置.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《hibernate配置.ppt》由会员分享,可在线阅读,更多相关《hibernate配置.ppt(41页珍藏版)》请在三一办公上搜索。

1、Hibernate配置,目 录,1 Hibernate概述2 第一个Hibernate程序3 Hibernate的配置文件4 深入理解持久化对象5 Hibernate的映射文件6 JPA Annotation介绍7 本讲小结,Hibernate体系结构,简要的Hibernate体系架构,Hibernate全面解决方案体系架构,Hibernate全面解决方案架构解释,SessionFactory单个数据库映射关系经过编译后的内存镜像。Session它是应用程序和持久存储层之间交互操作的一个单线程对象瞬态对象系统进行new关键字进行创建的Java 实例,没有Session 相关联,此时处于瞬态持久

2、化对象如果PO 实例与Session实例关联起来,且该实例关联到数据库的记录脱管对象如果PO实例曾经与Session实例关联过,但是因为Session的关闭等原因,PO实例脱离了Session 的管理,Hibernate全面解决方案架构解释,事务(Transaction)代表一次原子操作,它具有数据库事务的概念但它通过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA事务中隔离开。一个Session 之内可能包含多个Transaction对象。所有的持久化操作都应该在事务管理下进行,即使是只读操作。连接提供者(ConnectionProvider)生成JDBC的连接的工厂,同时具备连接

3、池的作用他通过抽象将底层的DataSource和DriverManager隔离开。这个对象仅在应用程序需要扩展时使用。事务工厂(TransactionFactory)生成Transaction对象实例的工厂,Hibernate工作原理,从流程图中可以看出,Hibernate的执行过程如下:(1)配置好hibernate的配置文件和与类对应的配置文件后,启动服务器。(2)服务器通过实例化Configeration对象,读取cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系。(3)通过实例化的Configeration对象创建一个sessionFactory实例。(4)通过

4、sessionFactory实例可以创建session对象。(5)得到session之后,便可以开始一个事务,然后就可以通过Session接口提供的各种方法操纵对数据库的访问。除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的session内置方法来实现。(6)操作完成后,提交数据库操作结果,关闭Session连接。,Hibernate的配置,Configuration对象org.cfg.Configuration实例代表一个应用程序到SQL数据库的映射配置,Configuration提供了一个buildSessionFactory()方法,该方法可以产生一个不可变的Se

5、ssionFactory对象。配置Hibernate的方式使用properties文件作为配置文件。使用cfg.xml文件作为配置文件。不使用任何的配置文件,以编码方式来创建Configuration对象。,Hibernate的配置,JDBC连接属性配置数据库方言配置JNDI数据源的连接属性配置Hibernate事物属性配置二级缓存相关属性配置外连接抓取属性配置其他常用的配置,JDBC连接配置中最重要的设置,connection.driver_class:设置连接数据库驱动。connection.url:设置所连接数据库服务的URL。connection.username:连接数据库的用户名。

6、connection.password:连接数据库的密码。connection.pool_size:设置hibernate数据库连接池的最大并发连接数。dialect:设置数据库连接所使用的方言。,其他常用的配置属性,show_sql:是否在控制台输出Hibernate生成的SQL语句,只能为true或者false两个值format_sql:是否将SQL语句转换成格式良好的SQL语句。use_sql_comments:是否在Hibernate生成的SQL语句中添加有助于调试的注视,只接受true和false两个值。jdbc.fetch_size:指定JDBC抓取数量的大小,它可以接受一个整数值

7、,其实质是调用Statement.setFetchSize()方法。jdbc.batch_size:指定Hibernate使用JDBC2的批量更新的大小,它可接受一个整数值,建议是取5到30之间。connection.autocommit:设置是否自动提交。通常不建议自动提交。hbm2ddl.auto:设置当创建SessionFactory是,将Drop刚建的数据表。该属性可以是update、create和drop-create三个值。,目 录,1 Hibernate概述2 第一个Hibernate程序3 Hibernate的配置文件4 深入理解持久化对象5 Hibernate的映射文件6 J

8、PA Annotation介绍7 本讲小结,持久化类的要求,提供一个无参的构造器提供一个标识属性标识属性的类型尽量避免基本类型为持久化类的每个属性添加set和get方法使用非final类重写equal()和hashCode()方法,持久化对象的状态,持久化对象 PO=POJO+映射文件PO可有以下的3种状态。瞬态:如果PO实例从未与Session实例关联过,该实例处于瞬态状态。持久化:如果PO 实例与Session实例关联起来,且该实例关联到数据库的记录。脱管:如果PO实例曾经与Session实例关联过,但是因为Session的关闭等原因,PO实例脱离了Session 的管理,这种状态被称为脱

9、管状态。对PO的操作必须在Session的管理下才能同步到数据库,Session由SessionFactory 工厂产生,SessionFactory是数据库编译后的内存镜像,通常一个对应一个SessionFactory对象。SessionFactory对象是由Configuration对象生成,Configuration负责加载Hibernate配置文件。,持久化对象的状态,瞬态:对象由new操作符创建,且尚未Hibernate Session 关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失去了瞬态对象的引用,瞬态对象将会被垃圾回收机制销毁。使

10、用Hibernate Session 可以将其变为持久化状态。,持久化对象的状态,持久化:持久化实例在数据库中有对应的记录,并且拥有一个持久化标识。持久化的实例是可以刚刚保存的,也可以是刚刚被加载的,无论那一种,持久化对象都必须与指定的hibernate Session关联。hibernate会检测到处于持久化状态对象的改动,在当前操作执行完成时将对象数据写回数据库。开发者不需要手动执行UPDATE。,持久化对象的状态,脱管:某个实例曾属于持久化状态,但随着与之关联的Session被关闭,该对象就变为了脱管态。对脱管对象的引用依然有效,对象可以被继续修改。如果让脱管对象与某个Session关联

11、,那么这个脱管态对象将会重新转换为持久化状态,而脱管态期间的改动也不会丢失,也可被写入数据库。正是因为这个原因,逻辑上的长事务成为了可能,它被称为应用程序事务。即事务可以跨越用户的思考,因为当对象处于脱管态,对该对象操作无须锁定数据库,不会造成性能的下降。,持久化对象的状态迁移,持久化实体:1、Serializable save(object obj)将对象变为持久化状态 2、void persist(object obj)将对象转化为持久化状态 3、Serializable save(object obj,object pk)将obj对象转化为持久化状态,该对象保存到数据库,指定主键值 4、

12、void persist(object obj,object pk)也加了一个设定主键,把一个瞬态对象变成持久化状态:-/创建消息对象News n=new News();/设置消息标题和消息内容n.setTitle(疯狂Java联盟成立了);n.setContent(疯狂Java联盟成立了,+网站地址http:/www.crazyit.org);/保存消息 sess.save(n);,Get方法和Load方法的区别,get():立即加载对象的属性立即从数据库中去查找load():延迟加载对象的属性只有在使用的时候才从数据库中去查找,更新持久化实体:sess.flush();底层在sess.fl

13、ush()之前生成一条update语句带有where=,更新托管实体:程序修改托管状态时,程序应该显式的使用新的Session来保存修改。hibernate提供了三个方法Update方法:如果持久化过时使用save方法:如果没有持久化过会时使用。updateOrSave()方法:如果不记得该对象是否 持久化过时使用。,merge方法与update方法功能相同,区别:执行sess.merge(a)方法后,a对象不是持久化对象的状态。而Update会把a变成持久化对象,删除持久化实体delete()Session的delete()方法能使一个持久化对象或临时脱管对象转化为临时对象。对于脱管对象,d

14、elete()方法从数据库中删除与它对应的记录;对于持久化对象,delete()从数据库中删除与它对应的记录,并且把它从Session的缓存中删除。如:sess2.delete(u);,close()当调用Session的close()时,Session的缓存被清空,缓存中的所有持久化对象都变为脱管对象。如果在应用程序中没有引用这些脱管对象,它们就会结束生命周期。evict()Session的evict()能够从缓存中删除一个持久化对象,使它变为脱管状态。当Session的缓存中保存了大量的持久化对象时,会消耗许多内存空间,为了提高性能,可以考虑调用evict(),从缓存中删除一些持久化对象。

15、但不推荐使用evict()。,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(把对象变成持久对象,但不会同步对象的状态)。,通过Session完成基本操作,Hibernate对数据库的基本操作是通过Session来完

16、成的。Session提供了基本的保存、更新、删除和查询的方法。,1 保存数据,session.save()方法用于实体对象的持久化保存。如:session.save()方法执行时,并不会马上更新数据库库,只有在session清理缓存时才有可能执行insert语句。,Person user=new Person();user.setName(zx);Transaction tx=session.beginTransaction();session.save(user);session.flush();mit();session.close();tx.close();,2 加载数据,session

17、的load()和get()方法都能根据给定的OID(Object identifier,对象标识)从数据库中加载一个持久化对象。区别:当数据库中不存在与OID对应的记录时,load()方法抛出异常,而get()方法返回null这两个方法都能将对象变成持久化状态,置于当前Session的缓存中,因此修改了持久化对象的属性后,当Session清理缓存时,会根据持久化对象的属性变化来同步更新数据库。,Session session1=sf.openSession();Transaction tx1=session.beginTransaction();Custom a=(Custom)session

18、1.load(Custom.class,new Long(1);Custom b=(Custom)session1.load(Custom.class,new Long(2);mit();Session1.close();,Company Logo,3 更新数据,session.update()方法能够将一个处于临时脱管或状态的对象,重新纳入Hibernate的内部缓存,变成持久化对象。session.update()方法被调用时,并不立刻执行SQL语句,而是等到更新操作累计到一定程度的时候在提交事务的时候一起执行。,Transaction tx=session.beginTransactio

19、n();session.update(customer);/提交mit();session.close();tx.close();,4 saveOrUpdate方法,有save()和update()方法的功能,对于传入的对象,首先会执行一遍查询语句判断该对象在数据库中是否存在,然后调用相应的方法。如果传入该方法的是一个脱管对象,那么这个方法就会执行update操作,如果传入该方法的是一个临时对象,那么这个方法就会执行insert操作。原理:首先在缓存中寻找,如果找到就直接返回如果实体实现了拦截方法,就执行isUpdate()方法如果实体处于临时状态就执行save()方法,如果实体处于脱管状态就

20、执行update()方法,Company Logo,5 删除数据,delete()方法用于从数据库中删除一个实体所对应的数据如果传入的对象是持久化对象,那么当清理缓存时,就会执行delete操作。如果传入的是脱管对象,那么首先会使该对象与session相关联,然后当清理缓存时,再执行delete操作例如:,Session session=sessionFactory().openSession();Transaction tx=session.beginTransaction();Customer customer=(Customer)session.load(Customer.class,”1”);/计划执行一条delete语句session.delete(customer);/清理缓存,执行一条delete语句mit();/关闭session,这时将会把customer对象从缓存中删除。session.close();,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号