1、getCurrentSession()与openSession()的区别?
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
创建的session则不会
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
创建的session必须手动关闭
2、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
* 如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
* 如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
栗子:
|
package
com.myj.hibernate.model;
import
org.hibernate.HibernateException;
import
org.hibernate.SessionFactory;
import
org.hibernate.cfg.AnnotationConfiguration;
import
org.hibernate.classic.Session;
import
org.junit.AfterClass;
import
org.junit.BeforeClass;
import
org.junit.Test;
public
class
TeacherTest {
public
static
SessionFactory sessionFactory =
null
;
@BeforeClass
public
static
void
beforeClass() {
try
{
sessionFactory =
new
AnnotationConfiguration().configure().buildSession Factory();
}
catch
(HibernateException e) {
e.printStackTrace();
}
}
@Test
public
void
testTeacherSave() {
Teacher teacher =
new
Teacher();
teacher.setName(
"martian"
);
teacher.setAge(
23
);
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(teacher);
//测试getCurrentSession()方法,这里输出true,因为在一个事务内,所以取得线程中的session
Session session1 = sessionFactory.getCurrentSession();
System.out.println(session == session1);
//commit()之后不用close(),假如使用sessionFactory.openSession();就需要close();
session.getTransaction().commit();
//测试getCurrentSession()方法,这输出false,上一个事务已经提交,这里将重新生成一个session
Session session2 = sessionFactory.getCurrentSession();
System.out.println(session == session2);
}
@AfterClass
public
static
void
afterClass() {
sessionFactory.close();
}
}
|