Hibernate小节
时间:2010-10-09 来源:Glare
getCurrentSession和openSession方法
HibernateSessionFactory有两个得到Session接口对象的方法, 分别是openSession()和getCurrentSession(). 区别在于:1.getCurrentSession方法时会首先在hibernate session context中寻找有无可用的session, 如果没有才创建一个新的. 而openSession方法时始终创建一个新的Session.
2.getCurrentSession返回的session,当Transaction在commit时会自动关闭,而openSession返回的 session必须显示调用session.close()进行关闭。
总结: 未测试getCurrentSession是否如MyEclipse中自动生成的SessionFactory一样绑定当前线程, 但从配置文件上来看的确如此, 有待确认.
load和get方法
1.load方法返回的是代理对象, 等到真正用到该对象的时候才发出sql语句, get方法直接从数据库查找并返回具体对象, 不会延迟.2.不存在对应记录时表现不一样:使用load方法时, 若未找到该对象, 将抛出ObjectNotFoundException, 而get方法返回null.
相同点:
无论是load还是get方法, 都会首先在查找一级缓存(load会先查找二级缓存(if exist)). 如果没有, 才会去数据库中查找.
e.g.
[...]
session.beginTransaction();
Teacher t1 = (Teacher)session.load(Teacher.Class, 1);
System.out.println(t1.getName()); // send query statement and get the result then print.
Teacher t2 = (Teacher)session.load(Teacher.Class, 1);
System.out.println(t2.getName()); // now here, the Object is exist, just print it.
session.getTransaction().commit();
总结: 当一个对象从数据库中通过load和get方法查询出来以后, 该数据变为persistent状态. 如果在事务提交或回滚前在查询一遍相同的对象时, hibernate只发一条SQL语句.
相关阅读 更多 +