Hibernate学习笔记之体系结构的理解(二)
2015-06-11 11:02
357 查看
1.SessionFactory对象
正如其名字所示意,org.hibernate.SessionFactory主要用于生成Session对象,对应用程序而言,它是Connection provider; 一个SessionFactory对象对应于一个数据库.SessionFactory是线程安全的,可以多个线程同时使用,而session则不是.除了为应用提供Session对象外,SessionFactory中还可以配置Hibernate的second-level cache.
2.Session深入理解
(1)session基本理解:
org.hibernate.Session是hb的核心对象,对象的存取都是通过它进行的;session由SessionFactory对象创建,在其内部包装了一个JDBC Connection对象,即一个Session对象使用了一个Connection对象,因此,Session对象使用完毕后,应close;在web应用中,Session对象的关闭可以在Filter中进行.但要注意的是,在lazy-load情况下,如果取得对象后,关闭了Session,再取得其子对象时,就会出错.
Hb内部维持了一个Session Pool,每次取得Session时,并不会新创建一个,在使用完毕调用Close后,也只是将Session放回池中.
Session同时还是一个TransactionFactory,为应用提供事务对象.
(2)使用session查找/保存对象
save()保存对象,且更新对象的ID(在tx.commit()之前就更新,事务还没提交,),对象还在缓存中
get()查找对象,在缓存中和DB中查找
load()在缓存中查找,若未找到对象,则抛出LazyInitializationException异常
(3)删除/更新对象
delete()删除对象
update更新对象
saveOrUpdate当对象有id时,更新对象,没有时则保存对象
对象在持久化状态中时,即与其关联的session还未关闭,对对象的更改,在调用session.flush后,将生效到数据库中,且必须在commit之前.
3.Hibernate中对象的四种状态
(1)自由状态(Transient)
没有拷久化,没有关联Session
(2)持久状态(Persistent)
自由状态的对象经过save保存的,或是通过load/get方法载入的对象,且session还未关闭,这种状态下与数据库是关联的,对对象的改变也会更新到数据库中(调用flush)
(3)游离状态(Detached)
持久状态的对象,session关闭后就成了游离状态,它脱离的session的管理,可以通过update方法重新进入持久状态
(4)移除状态(removed)
通过delete()/remove()调用后,从数据库中删除的对象
4.session主要方法:
get:
load:
save:
saveOrUpdate:
flush:清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性
getStatistics:
merge: 与saveOrUpdate有点类似,但对象不受session管理,调用后对象是游离状态
证明load/get都会先从缓存中查找对象
证明调用load后并没有马上去查db,返回的是一个代理对象;
它是延迟加载的,当要使用它的时候才会去查询,这样性能会好些
(1)session.close()放在对象属性访问语句之后,出现org.hibernate.ObjectNotFoundException异常;
(2)session.close()放在对象属性访问语句之前,出现org.hibernate.LazyInitializationException异常;
那么调用load时session.close就不能放在dao中了,也不知道该怎么放,感觉不太方便哪.
返回类型不同:save返回Serializable对象,而persist返回void
ID赋值时机不同:二者同样用于将transient实例持久化,但persist不保证ID值立即赋给持久化实例,可能会在flush的时候给ID赋值。
transaction外的行为不同:如果在transaction之外调用,persist保证会立即执行INSERT语句;而save则不保证(save返回一个identifier,如果必须执行INSERT来获取该identifier,则就会立即执行INSERT,而不论是在transaction之内或之外)
使用场景:由于上述第三点区别,persist方法适用于被扩展的Session上下文的长期运行的会话中(useful in long-running conversations with an extended Session context);而save则不适用。
正如其名字所示意,org.hibernate.SessionFactory主要用于生成Session对象,对应用程序而言,它是Connection provider; 一个SessionFactory对象对应于一个数据库.SessionFactory是线程安全的,可以多个线程同时使用,而session则不是.除了为应用提供Session对象外,SessionFactory中还可以配置Hibernate的second-level cache.
2.Session深入理解
(1)session基本理解:
org.hibernate.Session是hb的核心对象,对象的存取都是通过它进行的;session由SessionFactory对象创建,在其内部包装了一个JDBC Connection对象,即一个Session对象使用了一个Connection对象,因此,Session对象使用完毕后,应close;在web应用中,Session对象的关闭可以在Filter中进行.但要注意的是,在lazy-load情况下,如果取得对象后,关闭了Session,再取得其子对象时,就会出错.
Hb内部维持了一个Session Pool,每次取得Session时,并不会新创建一个,在使用完毕调用Close后,也只是将Session放回池中.
Session同时还是一个TransactionFactory,为应用提供事务对象.
(2)使用session查找/保存对象
save()保存对象,且更新对象的ID(在tx.commit()之前就更新,事务还没提交,),对象还在缓存中
get()查找对象,在缓存中和DB中查找
load()在缓存中查找,若未找到对象,则抛出LazyInitializationException异常
(3)删除/更新对象
delete()删除对象
update更新对象
saveOrUpdate当对象有id时,更新对象,没有时则保存对象
对象在持久化状态中时,即与其关联的session还未关闭,对对象的更改,在调用session.flush后,将生效到数据库中,且必须在commit之前.
//形参UserInfo userInfo session.save(userInfo); tx.commit(); tx = session.beginTransaction(); userInfo.setName("44444444444"); session.flush(); tx.commit()
3.Hibernate中对象的四种状态
(1)自由状态(Transient)
没有拷久化,没有关联Session
(2)持久状态(Persistent)
自由状态的对象经过save保存的,或是通过load/get方法载入的对象,且session还未关闭,这种状态下与数据库是关联的,对对象的改变也会更新到数据库中(调用flush)
(3)游离状态(Detached)
持久状态的对象,session关闭后就成了游离状态,它脱离的session的管理,可以通过update方法重新进入持久状态
(4)移除状态(removed)
通过delete()/remove()调用后,从数据库中删除的对象
4.session主要方法:
get:
load:
save:
saveOrUpdate:
flush:清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性
getStatistics:
merge: 与saveOrUpdate有点类似,但对象不受session管理,调用后对象是游离状态
public void testSaveAndload(UserInfo userInfo){ Session session = HBUtils.getSession(); Transaction tr = session.beginTransaction(); session.save(userInfo); System.out.println("save后="+userInfo); UserInfo u = (UserInfo)session.load(UserInfo.class, 15); System.out.println("load后="+u); u = (UserInfo)session.get(UserInfo.class, 15); System.out.println("get后="+u); }打印:
Hibernate: insert into userinfo (name) values (?) save后=(15,testSaveMethod) load后=(15,testSaveMethod) get后=(15,testSaveMethod)
证明load/get都会先从缓存中查找对象
<pre name="code" class="java"> public void testSaveAndload(UserInfo userInfo){ Session session = HBUtils.getSession(); Transaction tr = session.beginTransaction(); session.save(userInfo); System.out.println("save后="+userInfo); UserInfo u = (UserInfo)session.load(UserInfo.class, 1); System.out.println(u.getId()); System.out.println("load后="+u); }
Hibernate: insert into userinfo (name) values (?) save后=(17,testSaveMethod) 1 Hibernate: select userinfo0_.id as id0_0_, userinfo0_.name as name0_0_ from userinfo userinfo0_ where userinfo0_.id=? load后=(1,windskymr)
证明调用load后并没有马上去查db,返回的是一个代理对象;
它是延迟加载的,当要使用它的时候才会去查询,这样性能会好些
public void testSaveAndload(UserInfo userInfo){ Session session = HBUtils.getSession(); UserInfo u = (UserInfo)session.load(UserInfo.class, 0); session.close(); System.out.println(u.getId()); System.out.println("load后="+u); //session.close(); }调用load方法时id传入值在DB中找不到,会出现两种异常:
(1)session.close()放在对象属性访问语句之后,出现org.hibernate.ObjectNotFoundException异常;
(2)session.close()放在对象属性访问语句之前,出现org.hibernate.LazyInitializationException异常;
那么调用load时session.close就不能放在dao中了,也不知道该怎么放,感觉不太方便哪.
save与persist的区别
返回类型不同:save返回Serializable对象,而persist返回voidID赋值时机不同:二者同样用于将transient实例持久化,但persist不保证ID值立即赋给持久化实例,可能会在flush的时候给ID赋值。
transaction外的行为不同:如果在transaction之外调用,persist保证会立即执行INSERT语句;而save则不保证(save返回一个identifier,如果必须执行INSERT来获取该identifier,则就会立即执行INSERT,而不论是在transaction之内或之外)
使用场景:由于上述第三点区别,persist方法适用于被扩展的Session上下文的长期运行的会话中(useful in long-running conversations with an extended Session context);而save则不适用。
相关文章推荐
- 201506110920_《JavaScript权威指南》(p156-159)
- POJ 2470
- POJ 2487
- POJ 2485
- SAT数学基础词汇记忆
- ci框架中session闪出数据flash
- 盒子模型 box-sizing中content-box和border-box
- 热迁移数据与matlab绘图
- mysql按照时间段内 每天统计
- POSIX文件及目录管理
- 字典dictr的setdefault()方法如何使用
- POJ 2453
- 网页图表Highcharts实践教程之标签组与载入动画
- 配置org.springframework.scheduling.quartz.CronTriggerBean (转载)
- 图论的一些总结
- L298N 驱动模块的应用
- 图的邻接表存储
- 猫都能学会的Unity3D Shader入门指南(一)
- char与byte差异
- 给多个表批量添加一列并赋予默认值