getCurrentSession () 使用当前的 session
openSession() 重新建立一个新的 session
-------------------------
SessionFactory.getCurrentSession() 是 Hibernate 应用获取 Session 的常用方法。在调用该方法时, Hibernate 会从 interface CurrentSessionContext 获取当前的 Session ,这是 Hibernate 在不同组件中传递 Session 的方法。
CurrentSessionContext 有三个实现,分别是 ThreadLocalSessionContext 、 JTASessionContext 和 ManagedSessionContext 。
ThreadLocalSessionContext 将 Session 与当前线程绑定,是使用较多的一种方案;
JTASessionContext 将 Session 与 JTA 事务绑定,在 JTA 环境中使用;
ManagedSessionContext 使应用可以通过 bind() 和 unbind() 方法控制 Session 的绑定,主要在有 Conversation 的应用中使用(如果使用 ManagedSessionContext ,开发人员要做的事情还是很多的)。
CurrentSessionContext 实现的选择可以通过 hibernate.current_session_context_class 来配置。
另一种更常见的创建 Session 的方法是 openSession() 。
openSession() 与 getCurrentSession() 有何不同和关联呢?
在 SessionFactory 启动的时候, Hibernate 会根据配置创建相应的 CurrentSessionContext ,在 getCurrentSession() 被调用的时候,实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时,如果当前 Session 为空, currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。
再说 ManagedSessionContext ,它提供了更灵活的绑定 Session 的方式,但是使用起来去不简单。
在 Hibernate 的 CaveatEmptor 实例中有关于使用 ManagedSessionContext 的例子,但更好的选择是使用 Seam Framework 。
分享到:
相关推荐
博文链接:https://shaqiang32.iteye.com/blog/201918
当我们调用SessionFactory().getCurrentSession()时,Hibernate会为我们提供一个已存在的或者新创建的Session实例,这个行为与直接调用SessionFactory.openSession()有所不同。`getCurrentSession()`方法旨在支持...
在Java的Hibernate框架中,`getCurrentSession()` 和 `openSession()` 都是用于获取与数据库交互的Session对象,但它们之间存在显著的区别。理解这些差异对于优化数据访问性能和管理事务至关重要。 首先,`...
Session session = sessionFactory.getCurrentSession(); session.save(stu); } // 其他方法省略 } ``` #### 总结 通过上述内容的学习,我们可以看出Hibernate作为一款强大的ORM框架,极大地简化了数据库...
Assert.assertNotNull(sessionFactory.openSession()); } 2,配置声明式事务(使用基于注解的方式) 1,配置 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework....
在Spring中,我们可以使用`SessionFactory.openSession()`或`SessionFactory.getCurrentSession()`方法获取Session实例。 4. **事务管理**:Spring提供了声明式事务管理,只需在方法上添加@Transactional注解,即可...
- 创建`Session`:`SessionFactory.openSession()`或`SessionFactory.getCurrentSession()`(在已配置的事务环境下)。 - 事务开始:`Session.beginTransaction()`。 - 数据操作:如`Session.save()`, `Session....
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); User user = new User(); // set user properties... session.save(user); tx.commit(); session.close(); ``` #...
Session session = sessionFactory.getCurrentSession(); return session.get(User.class, username); } } ``` 4. **服务层(Service Layer)**: 在服务层,我们处理业务逻辑。例如,登录验证通常在`UserService...
- 错误2:`java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session` - 解决方案:由于Hibernate4移除了HibernateDaoSupport,需要改写DAO层,直接使用Hibernate...
- **Session**是与数据库交互的主要接口,`sessionFactory.openSession()`会创建一个新的Session,需要手动关闭;`sessionFactory.getCurrentSession()`则会在已有的事务上下文中获取或创建Session,自动管理关闭。...
2. **为什么使用getCurrentSession()**:与直接调用`openSession()`创建新的Session相比,`getCurrentSession()`有以下优势: - 它能够自动管理Session的生命周期,比如在请求结束时关闭Session,避免资源泄露。 -...
Session session = sessionFactory.openSession(); ``` 代码展示了如何从配置文件中读取配置信息,构建SessionFactory,再通过SessionFactory来创建Session。 4. ORM映射文件(.hbm.xml)的示例: ```xml <!...
本文详细介绍了Hibernate框架中的核心配置文件`hibernate.cfg.xml`及其配置项、映射文件`xxx.hbm.xml`,以及核心API如Configuration和SessionFactory的使用方法,并对C3P0连接池进行了简要说明。通过这些内容的学习...
通过SessionFactory.openSession()或getCurrentSession()方法获取Session实例。 五、持久化操作 1. 插入:使用Session的save()或saveOrUpdate()方法插入新记录。 2. 更新:调用Session的update()或saveOrUpdate()...
- `SessionFactory`和`Session`:在Spring中,我们可以使用`SessionFactory`的`openSession()`方法获取`Session`对象,执行数据库操作。通过`@Autowired`注入`SessionFactory`,然后在需要的地方创建`Session`。 4...
Session session = sessionFactory.getCurrentSession(); SQLQuery query = session.createSQLQuery("SELECT id, name FROM User WHERE age > :age") .addScalar("id", Hibernate.LONG) .addScalar("name", ...
- 获取Session:通过SessionFactory的openSession()或getCurrentSession()获取Session实例。 - 开启事务:在Session上开始一个新的数据库事务。 - 对象操作:执行增删改查操作,如save()、update()、delete()、...