创建一个单例模式工具类,再通过在Hibernate配置文件中开启Session的线程管理模式的方法
- 单例模式工具类
package test.hibernate.spring.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.MetadataSources; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; public class HibernateUtil { public static HibernateUtil hibernateUtil = null; public HibernateUtil() {}; //将该类作成单例模 式 public static HibernateUtil getinstance() { if(hibernateUtil==null) { hibernateUtil=new HibernateUtil(); } return hibernateUtil; } public SessionFactory getSessionFactory() { /* hibernate规定,所有的配置或服务,必须配置或注册到一个服务注册类中 */ Configuration configuration = new Configuration().configure(); ServiceRegistry sr = configuration.getStandardServiceRegistryBuilder().build(); /* 从注册类中获得工厂类 */ return new MetadataSources(sr).buildMetadata().buildSessionFactory(); } /* 获取session的对像方法 */ public Session getSession() { /* 从单前线程中获取Session,session在完成操作后将会自动关闭 */ return getSessionFactory().getCurrentSession(); } }
- Hibernate配置文件中开启Session的线程管理模式的方法
<!-- 开启Session的线程管理模式 --> <property name="current_session_context_class">thread</property>
- 测试应用
public void testGet() { Session session=HibernateUtil.getinstance().getSession(); Transaction transaction=session.beginTransaction(); Student s = session.get(Student.class, 1); System.out.println(s.getTeachers().size()); transaction.commit(); }
手动创建方式,以一个测试类为例
public class TestSession { SessionFactory sessionFactory = null; Session session = null; Transaction ts = null; @Before public void beforP() { System.out.println("begin...."); /* hibernate规定,所有的配置或服务,必须配置或注册到一个服务注册类中 */ Configuration configuration = new Configuration().configure(); ServiceRegistry sr = configuration.getStandardServiceRegistryBuilder().build(); /* 从注册类中获得工厂类 */ sessionFactory = new MetadataSources(sr).buildMetadata().buildSessionFactory(); /* 通过工厂类开启Session */ session = sessionFactory.openSession(); /* 开启事务 */ ts = session.beginTransaction(); } @After public void endP() { System.out.println("end...."); /* 提交事务 */ ts.commit(); /* 关闭Session */ session.close(); /* 关闭工厂 */ sessionFactory.close(); } @Test public void testGet() { // 使用get时, class标签中lazy值不管是true还是false都会直接加载,当set标签 // 中fetch="join"时,会在get时使用左join将其集体一起检索出来,访问数据库只需一次 // fetch值是其它时则需要访两次 Student s = session.get(Student.class, 1); System.out.println(s.getTeachers().size()); } }