StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties());
StandardServiceRegistry sr = srb.build();
SessionFactory sf = cfg.buildSessionFactory(sr);
Session session = sf.openSession();
hibernat 对数据库的操作是通过session来实现的,这里的session不同于页面间传递参数的session,
而是类似于jdbc中的 connection。session是hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与session息息相关。
session是由hibernatesessionfactory创建的,是线程安全的,可以让多个执行线程同时存取
hibernatesessionfactory而不会有数据共享的问题,但不能让多个线程共享一个session。
sessionfactory对象的创建:
java代码
configuration cfg = new configuration().configure();
sessionfactory sessions = cfg.buildsessionfactory();
session创建时使用了一个threadlocal类来建立一个session管理的辅助类,使用threadlocal可以有效隔离执行所用的数据,
避开了session的多线程之间的数据共享问题。
//创建一个线程本地变量。
java代码
public static final threadlocal
public static org.hibernate.sessionfactory sessionfactory;
//获取session的方法
public static sessin getsession() throws hibernateexception{
//返回线程局部变量的当前线程的值
session s = (session)threadlocal.get();
//如果sessionfactory为空,重新创建sessionfactory;如果线程为空,就打开一个新的session
if(session==null || !session.isopen()){
if(sessionfactory == null){
rebuildsessionfactory(); session = (sessionfactory != null) sessionfactory.opensession():null;
// 将hibernate的session放入到线程中保存;只要这个线程不结束,都可以通过线程的get()方法来获取
threadlocal.set(session);return session;