`
独立与自由
  • 浏览: 11834 次
社区版块
存档分类
最新评论

Hibernate3的getCurrentSession

 
阅读更多

通常我们使用hibernate总会写一个HibernateUtil类,大体这样:

 

public class HibernateUtil
{
	public static final SessionFactory sessionFactory;
	
	static
	{
		try
		{
			//采用默认的hibernate.cfg.xml来启动一个Configuration的实例
			Configuration configuration = new Configuration()
				.configure();
			//由Configuration的实例来创建一个SessionFactory实例
			sessionFactory = configuration.buildSessionFactory();
		}
		catch (Throwable ex)
		{
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}
	
	//ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步	
	public static final ThreadLocal<Session> session
		= new ThreadLocal<Session>();
	
	public static Session currentSession()
		throws HibernateException
	{
		Session s = session.get();
		//如果该线程还没有Session,则创建一个新的Session
		if (s == null)
		{
			s = sessionFactory.openSession();
			//将获得的Session变量存储在ThreadLocal变量session里
			session.set(s);
		}
		return s;
	}
	
	public static void closeSession()
		throws HibernateException 
	{
		Session s = session.get();
		if (s != null)
			s.close();
		session.set(null);
	}
}

 

将session绑定在当前线程内.

 

在hibernate3中增加了SessionFactory.getCurrentSession()直接获取上下文相关session。通过hibernate.current_sessiong根据事物环境来指定上下文session的底层实现

 

像这样:(hibernate.cfg.xml中<session-factory>子元素)

<!--指定根据当前线程来界定上下文相关Session-->
<property name="hibernate.current_session_context_class">thread</property>

 

<!--指定根据JTA事物来界定上下文session-->
<property name="hibernate.current_session_context_class">jta</property>

 

public class NewsManager
{
	public static void main(String[] args) 
		throws Exception
	{
		//实例化Configuration,这行代码默认加载hibernate.cfg.xml文件
		Configuration conf = new Configuration().configure();
		//以Configuration创建SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//打开上下文相关的Session
		Session sess = sf.getCurrentSession();
		//开始事务
		Transaction tx = sess.beginTransaction();
		//创建消息实例
		News n = new News();
		//设置消息标题和消息内容
		n.setTitle("疯狂Java联盟成立了");
		n.setContent("疯狂Java联盟成立了,"
			+ "网站地址http://www.crazyit.org");
		//保存消息
		sess.save(n);
		//提交事务
		tx.commit();
		//Session随事务的提交自动关闭,因此无需手动关闭
	}
}

 

0
0
分享到:
评论

相关推荐

    新Hibernate SessionFactory().getCurrentSession()猫腻

    标题提到的"新Hibernate SessionFactory().getCurrentSession()猫腻"揭示了一个常见的使用误区或者说是陷阱,即不正确地使用SessionFactory的getCurrentSession()方法。这篇文章可能探讨了这个方法在实际应用中的...

    ssh中getCurrentSession的使用

    在描述中提到的"ssh中getCurrentSession的使用",实际上可能是指在SSH集成框架中使用Hibernate框架时,获取数据库会话(Session)的方法。 在Hibernate中,`getCurrentSession()`是SessionFactory类的一个方法,它...

    Hibernate存储Clob字段的方式总结

    3. 在Hibernate的映射文件ItemsSaveclob.hbm.xml中,将content属性使用java.lang.String类型进行映射。 4. 在Hibernate的配置文件中添加"hibernate.connection.SetBigStringTryClob"属性,这对于Oracle数据库是必须...

    getCurrentSession 与 openSession() 的区别

    3. **性能影响**:`getCurrentSession()` 通过缓存Session减少了创建和关闭Session的开销,因此在高并发环境下可能更优。 4. **上下文感知**:`getCurrentSession()` 能够感知当前的上下文(如线程、请求),而`...

    SessionFactory.getCurrentSession与openSession的区别

    标题中的“SessionFactory.getCurrentSession与openSession的区别”是关于Hibernate框架中的两个关键操作,它们都是用于在Hibernate中获取数据库会话的。理解它们的区别对于优化数据访问性能和管理事务至关重要。 ...

    Hibernate源代码分析

    public org.hibernate.classic.Session getCurrentSession() throws HibernateException { if (currentSessionContext == null) { throw new HibernateException("No CurrentSessionContext configured!"); } ...

    struts+hibernate 项目

    查询通常借助Criteria、HQL或SQL语句,通过SessionFactory的getCurrentSession()获取的Session执行。 项目的具体实现细节,例如业务逻辑处理、数据访问对象(DAO)的设计、异常处理以及安全性考虑,都需要参考项目...

    hibernate执行原生sql语句

    Session session = HibernateSessionFactory.getCurrentSession(); SQLQuery query = session.createSQLQuery("select * from cats"); List&lt;Cat&gt; cats = query.addEntity(Cat.class).list(); ``` 在上面的代码中,...

    SSH整合学习笔记之spring与hibernate整合(二)之c3p0

    return sessionFactory.getCurrentSession(); } public void save(MyEntity entity) { getSession().save(entity); } } ``` 在上述代码中,`MyEntityDaoImpl`继承了`HibernateDaoSupport`,并自动获得了`...

    hibernate与spring整合demo

    3. 配置简化:Spring可以统一管理Hibernate的SessionFactory和Session,简化配置文件。 4. AOP集成:Spring的AOP可以与Hibernate的事务管理结合,提供更灵活的事务策略。 四、整合步骤 1. 引入依赖:在项目中添加...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    本篇文章将深入探讨在Hibernate3中如何通过Native SQL查询部分字段,并将其映射到具体的Java对象上。这种方式在处理一些特定的、效率较高的SQL查询时非常有用。 首先,我们需要理解Hibernate中的`SQLQuery`接口,这...

    springboot集成hibernate

    在本文中,我们将深入探讨如何将Spring Boot框架与Hibernate ORM集成,特别是在不使用JPA(Java Persistence API)的情况下。Spring Boot以其便捷的自动配置和简化Java应用开发而广受欢迎,而Hibernate作为Java领域...

    Hibernate的框架的总结

    - `getCurrentSession()`:获取当前线程绑定的Session,适用于单线程环境。 - 示例代码: ```java public class HibernateUtils { private static SessionFactory sessionFactory; static { Configuration ...

    Spring+Hibernate实现)Hibernate公用类

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层管理和数据持久化方面发挥着关键作用。本文将详细解析如何利用Spring和Hibernate来实现一个通用的DAO(Data Access Object)层,以提高代码...

    Hibernate4Spring3

    【Hibernate4Spring3】是Java开发中的一种常见整合框架,主要结合了Spring和Hibernate两个强大的开源框架,以实现更高效、灵活的后端数据管理。Spring是一个全面的、模块化的应用框架,它提供了依赖注入(Dependency...

    Hibernate更新某些字段

    Session session = HibernateUitl.getSessionFactory().getCurrentSession(); session.beginTransaction(); Teacher t = (Teacher) session.get(Teacher.class, 3); t.setName("yangtb2"); session.update(t); ...

Global site tag (gtag.js) - Google Analytics