因为每次用增删改查时都需要用到session,直接做一个类,需要的时候只需要调用即可
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { //定义常量是为了实现单例,不让随便new //ThreadLocal<Session>不是集合,是线程锁,为了单线程安全 private static final ThreadLocal<Session> lock = new ThreadLocal<Session>(); private static final SessionFactory factory = buildFactory(); private static SessionFactory buildFactory() { Configuration cfg = new Configuration().configure();//读取 hibernate.cfg.xml 的配置信息 return cfg.buildSessionFactory(); } public static Session getSession() { //先获取线程锁中的session Session session = lock.get(); if (session == null) {//如果没有session就新建一个session赋值给lock session = factory.openSession(); lock.set(session); } return session; } public static void closeSession() { Session session = lock.get();//先获取线程锁中的session if (session != null) {//如果session有值,那么关闭session session.close(); lock.set(null); //将session关闭之后再给lock赋值null,方便其他线程使用 } } }
调用这个类的方法
package com.itnba.maya.test; import java.util.List; import org.hibernate.*; import com.itnba.maya.model.Fruit; import com.itnba.maya.model.HibernateUtil; public class BB { public static void main(String[] args) { Fruit data = new Fruit(); data.setIds("s003"); data.setName("芒果"); data.setSource("不知道"); data.setPrice(12.0); data.setNumbers(100); data.setImage("没有"); Session session=null; try{ session=HibernateUtil.getSession(); session.beginTransaction(); session.save(data); session.getTransaction().commit(); }catch (Exception e) { session.getTransaction().rollback(); }finally { HibernateUtil.closeSession(); } } }
运行结果