首页 > Windows开发 > 详细

026_CoreAPI_Configuration_SessionFactory_GetCurrentSession_OpenSession

时间:2016-01-05 02:04:41      阅读:256      评论:0      收藏:0      [点我收藏+]

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();方法。

?

026_CoreAPI_Configuration_SessionFactory_GetCurrentSession_OpenSession

原文:http://yuzhouxiner.iteye.com/blog/2268457

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!