SessionFactory可以简单理解为数据库的连接池,用于产生session
产生session有两种方法
(1)Session session = sf.openSession();
(2)Session session = sf.getCurrentSession();
openSession每次都创建一个新的session,需要手动close
getCurrentSession如果没有提交过,一直用同一个session,提交后,新建一个session
(从上下文找,如果有,用旧的,如果没有,建新的)
i.用途,界定事物边界(事物的开始和结束,从beginTransaction到commit transaction)
产生session有两种方法
(1)Session session = sf.openSession();
(2)Session session = sf.getCurrentSession();
openSession每次都创建一个新的session,需要手动close
getCurrentSession如果没有提交过,一直用同一个session,提交后,新建一个session
(从上下文找,如果有,用旧的,如果没有,建新的)
i.用途,界定事物边界(事物的开始和结束,从beginTransaction到commit transaction)
ii.事物提交自动close
假设有一个addUser()方法,要对数据库执行save(User)和addLog()两个操作,这两个操作要放在一个transaction中,要么同时完成,要么都不完成。此时两个session就要是同一个session,不然不能放在一个transaction中。
public class StudentTest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
Configuration cfg = new Configuration();
cfg.configure();//解析XML文件,不加参数解析classpath下名字为hibernate.cfg.xml文件
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(
cfg.getProperties()).buildServiceRegistry();
sf = cfg.buildSessionFactory(sr);
}
@Test
public void test() {
Student s = new Student();
s.setName("lll");
s.setAge(11);
//Session session = sf.openSession();
Session session = sf.getCurrentSession();
session.beginTransaction();
session.save(s);
session.getTransaction().commit();
//session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
getCurrentSession需要配置
<property name="current_session_context_class">thread</property>