一、单例模式
1.在第一个项目的基础上将创建sessionfactory的代码封装成一个类,在manager中调用。
public class HibernateUtil {
private static SessionFactory sf = null;
private static Configuration cfg = null;
static {
try {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() {
return sf;
}
public static void closeSessionFactory(){
sf.close();
}
}
2.在hibernate.cfg.xml的 < session-factory>标签中添加如下内容,保证每个读写线程有唯一的Session实例。
<property name="hibernate.current_session_context_class">thread</property>
3.使用util工具代替manageUser中的sessionFactory,将打开session的方法openSession转换成getCurrentSession,保证线程安全。
Configuration conf = new Configuration().configure();
SessionFactory sf = HibernateUtil.getSessionFactory();//sessionFactory单态模式
Session session = sf.getCurrentSession();//保证每个读写线程有唯一的session实例
4.使用JUnit测试方法实现查询功能。
//查询用户对象
public void testQueryUser() {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf=HibernateUtil.getSessionFactory();//sessionfactory单态模式
session=sf.getCurrentSession();//one thread ,one session
ts=session.beginTransaction();
Query query = session.createQuery("from User");
List<User> users = query.list();
for(int i=0;i<users.size();i++) {
User u = users.get(i);
System.out.println(u.getName() +" " + u.getAge());
}
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
if(ts !=null) {
ts.rollback();
}
}finally {
session.close();
sf.close();
}
}