因为每次用增删改查时都需要用到hibernate的配置来生成session工厂进而生成session,比较麻烦,所以我们直接封装一个可以调用的类,需要的时候只需要调用即可。
新建一个HibernateUtil.java文件
package com.model; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory factory = builderFactory();//新建一个session工厂,定义为常量直接构建出来 private static final ThreadLocal<Session> threadlock = new ThreadLocal<Session>();//构建一个线程锁,保证安全,实现单线程不被占用 private static SessionFactory builderFactory() { Configuration config = new Configuration().configure();//读取hibernate配置 return config.buildSessionFactory(); } public static Session getSession(){ //获取线程锁中的session Session session=threadlock.get(); if(session==null){ //如果为空,则表明会话没有,则可以新建会话 session=factory.openSession(); //把会话放到线程锁中 threadlock.set(session); } return session; } public static void closeSession(){ Session session=threadlock.get(); if(session!=null){ //不为空,则表明会话中有内容需要关闭 session.close(); //再将线程锁中的内容清空 threadlock.set(null); } } }
测试一下:
package com.model; import org.hibernate.Session; public class TestFruit { public static void main(String[] args){ Fruit f = new Fruit(); f.setIds("q001"); f.setName("草莓"); f.setPrice(20.0); f.setSource("张店"); f.setNumbers(200); f.setImage("hahh"); Session session = null; try{ session=HibernateUtil.getSession(); session.beginTransaction(); session.save(f); session.getTransaction().commit(); }catch(Exception ex){ ex.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtil.closeSession(); } } }
效果如下:
HibernateUtil.java文件是已经封装好的,可以直接将内容复制过来正常使用,方便快捷。