SessionFactory:
a) 用来产生和管理Session
b)通常情况下每个应用只需要一个SessionFactory
c)除非要访问多个数据库的情况
d) 关注两个方法即: openSession 和 getCurrentSession
i. openSession 每次都是新的,需要close
ii. getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的
1,用途,界定事务边界
2,事务提交自动close
3,跟current_session_context_class (JTA、thread) 有关系
a)thread 使用 connection
注:上下文是什么?当前session运行的上下文,在hibernate.cfg.xml里指定的:
最常用的就是thread,看当前的线程里有没有session对象,有了就拿,没有就建新的。
<!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property>
SessionFactory怎么理解?
SessionFactory,产生session的工厂。一般情况下,每一个session里都有一个数据库的连接,(如果没有数据库连接,怎么和数据库打交道呢?)所以产生session的工厂里边一定有好多个数据库连接,所以SessionFactory维护的最重要的东西就是数据库连接池。当它产生一个session的时候,他会从数据库连接池拿出一个连接交给session。
package com.oracle.hibernate.id; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class HibernateCoreAPITest { private static SessionFactory sf = null; @BeforeClass public static void beforeClass() { //try-chatch是为了解决Junit有错误不提示的bug try { /** * AnnotationConfiguration().configure()会默认找src下的hibernate.cfg.xml,读取配置信息。 * 最主要的是数据库连接信息,帮你做出连接池。SessionFactory代表着跟数据库的连接 * configure()有个重载方法configure(String url)可以指定文件名;如果配置文件叫hibernate.xml, * 就configure("hibernate.xml"),默认去classpath下找配置文件 */ sf = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (HibernateException e) { e.printStackTrace(); } } @Test public void testTeacher() { Teacher t = new Teacher(); t.setName("li"); t.setTitle("high"); /** * getCurrentSession(): *1, 如果当前上下文有session,就拿来当前的session。如果没有,就创建一个新的session * 2,不写session.close(); * 注意:当session commit()提交的时候自动close(),写了会报错。 * 提交同时也会关闭当前session,上下文将不存在该session,此时getCurrentSession()就会创建一个新的session。 */ Session session = sf.getCurrentSession(); /** * session有个connection方法,返回值也是Connection,可以看出在这个session里绑定了一个Connection, * 这个Connection是从SessionFactory通过配置文件信息,产生的数据库连接池里取出的。所以简单理解,session等 * 同于一个Connection,不过也不能这个理解,hibernate还有很多很复杂的东西。 */ //session.connection(); //openSession(),永远都打开新的session。需要close(); //Session session = sf.openSession(); session.beginTransaction(); session.save(t); //当当前的session提交了,就关闭了,对象就没了。再getCurrentSession就是新的。 //session.getTransaction().commit(); //session.close(); //Session session2 = sf.openSession(); //两次opSession不是一个session,返回false //System.out.println(session == session2); //Session session2 = sf.getCurrentSession(); //如果session没commit,返回true,否则返回false //System.out.println(session == session2); } @AfterClass public static void afterClass() { sf.close(); } }