hibernate--coreapi--configuration sessionfactory--getcurrentsession--opensession

sessionfactory的目的:产生session,维护数据库连接池

测试文件里的sessionfactory创建数据库连接,所以sessionFactory通过配置文件里的配置信息产生一个数据库连接池, 从中取出一个数据库连接.

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

configure用于调用数据库信息, configure()里面可以指定hibernate.cfg.xml的名字

openSession() 永远是创建一个新的session, 此session需要close,

而getCurrentSession()如果环境上下文中有session就拿环境中的, 没有就建新的, 不需要close.

用getCurrentSession调用一个session:

@Test
	public void testTeacherSave() {	
		Teacher t = new Teacher();		
		t.setName("t1");
		t.setTitle("middle");
		t.setBirthDate(new Date());		
		//Session session = sessionFactory.openSession();
		Session session = sessionFactory.getCurrentSession();		
		session.beginTransaction();
		session.save(t);		
		Session session2 = sessionFactory.getCurrentSession();		
		System.out.println(session == session2);		
		session.getTransaction().commit();		
		Session session3 = sessionFactory.getCurrentSession();		
		System.out.println(session == session3);		
	}
结果: 第一个 true, 第二个false
因为第一个session被commit了
getCurrentSession方法的用途:界定事务边界, 事务提交后自动close.
在addUser的时候同时调用两个方法, 增加用户和增加日志, UserDAO,LogDAO,为了同步, 要使用同一个session
上下文在hibernate.cfg.xml配置文件里有指定:
 <property name="current_session_context_class">thread</property>

取值范围: jta,thread,managed,custom.class

current_session_context_class有两种: jta, thread

thread一般使用connection, 管理事务, auto_commit设为1, 无异常commit, 有异常rollback.

但是有一种事务使用一个connection无法管理, 比如有个类要同时操作两个数据库, 需要事务管理器, TransactionManager来同时管理 两个数据库. TM由application server实现,  weblogic和jboss也可以但是tomcat本身不可以, 但是可以通过spring实现,

此种事务就叫 JTA事务, 

事务有两种, 一种是connection, 只针对一个数据库, 而JTA针对分布式数据库.

JTA: JAVA Transaction API.   JPA: JAVA Persistence API. 

  

  

 

  

 

posted @ 2016-04-20 19:57  wujixing909  阅读(333)  评论(0编辑  收藏  举报