Hibernate学习笔记之体系结构的理解(二)

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之前.

//形参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的区别

  1. 返回类型不同:save返回Serializable对象,而persist返回void
  2. ID赋值时机不同:二者同样用于将transient实例持久化,但persist不保证ID值立即赋给持久化实例,可能会在flush的时候给ID赋值。
  3. transaction外的行为不同:如果在transaction之外调用,persist保证会立即执行INSERT语句;而save则不保证(save返回一个identifier,如果必须执行INSERT来获取该identifier,则就会立即执行INSERT,而不论是在transaction之内或之外)
  4. 使用场景:由于上述第三点区别,persist方法适用于被扩展的Session上下文的长期运行的会话中(useful in long-running conversations with an extended Session context);而save则不适用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Hibernate,我可以为你提供一些指导。Hibernate是一个Java持久化框架,用于将Java对象映射到关系数据库中。它简化了与数据库的交互,提供了ORM(对象关系映射)的功能。 如果你想学习Hibernate,以下是一些建议的步骤: 1. 了解基本概念:开始之前,建议你先了解一些Hibernate的基本概念,例如持久化、实体类、会话(Session)等。这将帮助你更好地理解Hibernate的工作原理。 2. 学习Hibernate配置:Hibernate使用一个配置文件来连接数据库和定义映射关系。你可以学习如何配置Hibernate以适应你的项目需求。这包括数据库连接配置、实体类映射等。 3. 学习Hibernate实体映射:Hibernate通过注解或XML文件将Java实体类映射到关系数据库表中。你可以学习如何使用注解或XML文件来定义实体类的映射。 4. 学习Hibernate查询语言(HQL):HQL是一种类似于SQL的查询语言,用于对数据库进行查询操作。学习如何使用HQL进行查询和操作数据库是很重要的。 5. 学习Hibernate事务管理:事务管理是在处理数据库操作时非常重要的一部分。学习如何使用Hibernate进行事务管理,包括开启事务、提交事务、回滚事务等。 6. 实践项目:最好的学习方法是通过实际项目来应用所学的知识。尝试在一个小型项目中使用Hibernate来进行数据库操作,这将帮助你更好地理解和掌握Hibernate的使用。 除了上述步骤,还有很多其他方面的内容可以学习,例如缓存管理、性能优化等。希望这些步骤能够帮助你入门Hibernate!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值