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