`

026_CoreAPI_Configuration_SessionFactory_GetCurrentSession_OpenSession

 
阅读更多

1.Configuration

 a)AnnotationConfiguration

 b)进行配置信息的管理

 c)用来产生SessionFactory()

 d)

 

sf = new AnnotationConfiguration().configure().buildSessionFactory();

.configure()去找hibernate.cfg.xml配置文件(进行数据库连接和产生连接池)

 

 

如果改变hibernate.cfg.xml名字,则在src下放sf = new AnnotationConfiguration().configure(“hi

 

bernate.xml”).buildSessionFactory();即可

 

 

 

2.public static SessionFactory sf = null;

 

可以理解为维护这数据库的连接池

产生session的工厂。

每个连接都能有一个数据库的链接。

 

使用getCurrentSession可以产生一个session

Session session = SessionFactory.getCurrentSession();

 

 

其实从Session session = SessionFactory.getCurrentSession();

session.connection()

可以看到其实这个session已经绑定了一个connection()

---哪来的呢,是SessionFactory通过配置文件里拿出配置信息产生的数据库连接池,

从那个数据库连接池里给你取出来的。

或是Session session = sf.openSession(),是永远创建新的session。

 

----用getCurrentSession()不用close();

---用openSession()用close()

 

区别:

1.

openSession永远打开新session

当前环境已经有session就拿原来的。

2.getCurrentSession();session没有提交前拿的是同一个。

 

Session session = SessionFactory.getCurrentSession();

 

 

其实从Session session = SessionFactory.getCurrentSession();

session.connection()

可以看到其实这个session已经绑定了一个connection()

---哪来的呢,是SessionFactory通过配置文件里拿出配置信息产生的数据库连接池,

从那个数据库连接池里给你取出来的。

或是Session session = sf.openSession(),是永远创建新的session。

 

----用getCurrentSession()不用close();

---用openSession()用close()

 

区别:

1.

openSession永远打开新session

当前环境已经有session就拿原来的。

 

2.getCurrentSession();session没有提交前拿的是同一个。

 

理解getCurrentSession的用处

1.对于一个用户管理系统,

client  (adduser())----->Usermanager (save(User)insert into user)---->UserDAO---->DB(User表)

                                     (addLog(insert into log())) ---->LogDAO ---->DB (Log表)

 

在这个情况就是用getCurrentSession进行同一个连接。

 

 

总结一下

1.opensession每次都是新的 

2.getCurrentSession  从上下文找,

   用途  界定事务边界。

   比如  插入一个数据+log日志表

 

3.open需要close

  get...事务提交后会自动close

 

4.什么叫上下文

是在配置文件制定的

 <!--<property name="current_session_context_class">thread</property>-->

从线程里面找这个对象。

 

手工管理用manage  很少用....

custom也少用自定义的。

jta  ejb3分布式再说

 

 

 

 

 

 

代码案例1:

 

    进行测试:

Session session = sf.openSession();

Session session2 = sf.openSession();

 

System.out.print("--------------------------------");

System.out.print(session == session2);

 

console结果:

     false

证明:

     openSession()每次都是新开的链接

 

 

代码案例2:

    1.进行测试

 

   Session session = sf.getCurrentSession();

Session session2 = sf.getCurrentSession();

System.out.print("--------------------------------");

System.out.print(session == session2);

 

  console结果:

           true

证明两个连接用的是同一个session。

   

     2.进行测试在事务提交之后再比较

Session session = sf.getCurrentSession();

 

//在hibernate中执行操作要在一个事务里面

session.beginTransaction();

session.save(t);

session.getTransaction().commit();

//在commit之后进行的获得getCurrentSession()

Session session2 = sf.getCurrentSession();

System.out.print("--------------------------------");

System.out.print(session == session2);

/*session.close();*/

 

  console返回:

    false

 

 

    

注意:

在使用Session session = sf.getCurrentSession();时,

1./hibernate_0500_CoreAPI/src/hibernate.cfg.xml这个要加上下文的配置信息

(<property name="current_session_context_class">thread</property>)

2.这个不需要session.close();方法。

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics