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