方法一:
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
使用openSession()方法打开,每次都是打开新的Session,用完后需要close()。
方法二:
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.getCurrentSession();
使用getCurrentSession()打开,若已存在session则打开现有session,若不存在则创建新的session。
在事务提交之前所有的getCurrentSession()打开的都是同一个session,例如:
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();
则有session1==session2。
若事务提交之后的getCurrentSession()则和提交之前得到的不是同一个session,例如:
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
Session session1 = sessionFactory.getCurrentSession();
Transaction transaction = session1.beginTransaction();
transaction.commit();
Session session2 = sessionFactory.getCurrentSession();
则有session1 != session2,即原有事务已提交session后,则getCurrentSession()打开的是新的session。
-----通过getCurrentSession()获得的session在事务提交的时候自动close()而不需再close()。
注意:使用getCurrentSession()之前需要设置session context,在配置文件hibernate.cfg.xml中设置<property name="current_session_context_class">thread</property>