被广泛使用的HibernateUtil类
- import org.hibernate.*;
- import org.hibernate.cfg.*;
- public class HibernateUtil {
- private static final SessionFactory sessionFactory;
- static {
- try {
- // 创建SessionFactory
- sessionFactory = new Configuration().configure()
- .buildSessionFactory();
- } catch (Throwable exception) {
- exception.printStackTrace();
- System.out.println("Initial SessionFactory creation failed.");
- throw new ExceptionInInitializerError(exception);
- }
- }
- // 用两个ThreadLocal类型的属性以保持在一次请求过程中共享单一的Session和Trasaction实例,
- // Session和Trasaction实例可以跨越多个一次请求的多个方法
- public static final ThreadLocal tLoaclsess = new ThreadLocal();
- public static final ThreadLocal tLocaltx = new ThreadLocal();
- // 取得session
- public static Session currentSession() {
- Session session = (Session) tLoaclsess.get();
- // 打开一个新的session,如果当前的不可用
- try {
- if (session == null || !session.isOpen()) {
- session = openSession();
- tLoaclsess.set(session);
- }
- } catch (HibernateException exception) {
- exception.printStackTrace();
- }
- return session;
- }
- // 关闭session
- public static void closeSession() {
- Session session = (Session) tLoaclsess.get();
- tLoaclsess.set(null);
- try {
- if (session != null && session.isOpen())
- session.close();
- } catch (HibernateException exception) {
- exception.printStackTrace();
- }
- }
- // 开始事务
- public static void beginTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- if (tx == null) {
- tx = currentSession().beginTransaction();
- tLocaltx.set(tx);
- System.out.println("beginTransaction");
- System.out.println(tLocaltx.toString());
- }
- } catch (HibernateException exception) {
- exception.printStackTrace();
- }
- }
- // 关闭事务
- public static void commitTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- System.out.println(tLocaltx.toString());
- try {
- if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
- tx.commit();
- }
- tLocaltx.set(null);
- System.out.println("commitTransaction");
- } catch (HibernateException exception) {
- exception.printStackTrace();
- }
- }
- // 回滚事务
- public static void rollbackTransaction() {
- Transaction tx = (Transaction) tLocaltx.get();
- try {
- tLocaltx.set(null);
- if (tx != null && tx.wasCommitted() && !tx.wasRolledBack()) {
- tx.rollback();
- }
- } catch (HibernateException exception) {
- exception.printStackTrace();
- }
- }
- private static Session openSession() throws HibernateException {
- return getSessionFactory().openSession();
- }
- private static SessionFactory getSessionFactory() throws HibernateException {
- return sessionFactory;
- }
- }
使用HibernateUtil进行数据的插入
- public class StudentDAOImp implements StudentDAO {
- private static Log log = LogFactory.getLog(StudentDAOImp.class);
- public List getStudent() {
- try {
- Session s = HibernateUtil.currentSession();
- HibernateUtil.beginTransaction();
- List results = s.createQuery("from Student stu").list();
- HibernateUtil.commitTransaction();
- HibernateUtil.closeSession();
- if (results != null && results.size() > 0) {
- return results;
- }
- } catch (HibernateException e) {
- log.fatal(e);
- }
- return null;
- }
- public boolean saveStudent(Student student) {
- try {
- Session s = HibernateUtil.currentSession();
- HibernateUtil.beginTransaction();
- s.saveOrUpdate(student);
- HibernateUtil.commitTransaction();
- HibernateUtil.closeSession();
- return true;
- } catch (HibernateException e) {
- e.printStackTrace();
- log.fatal(e);
- }
- return false;
- }
- }
在Struts+Hibernate+Tomcat5.5下运行总是显示
org.hibernate.HibernateException: Session is closed
at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:94)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:95)
at com.MyDemo.dao.hibernate.HibernateUtil.commitTransaction(HibernateUtil.java:75)
at com.MyDemo.dao.hibernate.CloseSessionFilter.doFilter(CloseSessionFilter.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at com.MyDemo.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Thread.java:619)
检查后发现HibernateUtil.commitTransaction时Session已经关闭.数据也插入不了,网上找不到解决方法.
后来看到使用在public boolean saveStudent(Student student)中加入HibernateUtil.beginTransaction();
s.saveOrUpdate(student);
s.flush();
HibernateUtil.commitTransaction();
数据是可以插入了,但报错依旧.