休眠程序未终止

时间:2020-02-23 14:41:53  来源:igfitidea点击:

最近,我正在编写一个小的休眠程序,并注意到即使成功执行了main方法,该程序也没有终止。
我正在使用Hibernate最新版本4.3.5.Final。

休眠程序未终止程序

我的示例类代码如下所示。

package com.theitroad.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.theitroad.hibernate.model.Employee1;
import com.theitroad.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		//Get Session
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		//start transaction
		session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		session.getTransaction().commit();
		System.out.println("Employee ID="+emp.getId());

	}
}

以上代码的问题在于,Hibernate不会释放资源,一旦完成,我们有责任释放资源。

如您所见,在上面的程序中,ServiceManager实例已创建但未关闭。

因此,我将程序更改为以下代码,并且在执行main方法后程序开始终止。

package com.theitroad.hibernate.main;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.theitroad.hibernate.model.Employee1;
import com.theitroad.hibernate.util.HibernateUtil;

public class HibernateMain {

	public static void main(String[] args) {
		Employee1 emp = new Employee1();
		emp.setName("Lisa");
		emp.setRole("Manager");
		emp.setInsertTime(new Date());
		
		SessionFactory sessionFactory = null;
		Session session = null;
		Transaction transaction = null;
		try{
		//Get Session
		sessionFactory = HibernateUtil.getSessionFactory();
		session = sessionFactory.getCurrentSession();
		//start transaction
		transaction = session.beginTransaction();
		//Save the Model object
		session.save(emp);
		//Commit transaction
		transaction.commit();
		System.out.println("Employee ID="+emp.getId());
		}catch(Exception e){
			System.out.println("Exception occured. "+e.getMessage());
		}finally{
			if(session.isOpen()){
				System.out.println("Closing session");
				session.close();
			}
			if(!sessionFactory.isClosed()){
				System.out.println("Closing SessionFactory");
				sessionFactory.close();
			}
		}
	}

}

请注意,我正在finally块中关闭资源,因此,即使应用程序抛出任何异常,所有资源也会被释放。