Hibernate中获取Session的两种方式代码示例

网友投稿 381 2023-03-07


Hibernate中获取Session的两种方式代码示例

Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与Session息息相关.

Session对象是通过SessionFactory构建的,下面举个例子来介绍Hibernate两种获取session的方式。

日志,是编程中很常见的一个关注点.用户http://在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在一个Session中进行,否则这就成为了两个线程.不能保证同步.看下面的代码

HibernateUtil管理Session的工具类

package com.bjpowernode.usermgr.util;

import org.hibernate.Session;

//hibernate3的

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtils {

private static SessionFactory factory;

static{

try{

//读取hibernate.cfg.xml文件

Configuration cfg=new Configuration().configure();

//建立SessionFactory

factory=cfg.buildSessionFactory();

}

catch(Exception e){

e.printStackTrace();

}

}

//获得开启着的Session

public static Session getSession(){

return factory.openSession();

}

//关闭Session

public static void closeSession(Session session){

if(session!=null){

if(session.isOpen()){

session.close();

}

}

}

public static SessionFactory getSessionFactory(){

return factory;

}

}

用户业务逻辑层

package com.bjpowernode.usermgr.manager;

import java.util.Date;

import org.hibernate.Session;

import com.bjpowernode.usermgr.domain.Log;

import com.bjpowernode.usermgr.domain.User;

import com.bjpowernode.usermgr.util.HibernateUtils;

public class UserManagerImpl implements UserManager {

/**

* 添加用户和添加日志都使用了同一个Session,所以

* 当用户添加失败的时候,日志也会添加失败。事务回滚

* 用户添加成功日志也会添加成功

*/

public void addUser(User user) {

Session session=null;

try{

//取得当前线程Session

session=HibernateUtils.getSessionFactory().getCurrentSession();

session.beginTransaction();

//保存用户

session.save(user);

Log log=new Log();

log.setType("操作日志");

log.setTime(new Date());

log.setDetail("XXX");

LogManager logManager=new LogManahttp://gerImpl();

//保存日志

logManager.addLog(log);

session.getTransaction().commit();

}

catch(Exception e){

e.printStackTrace();

session.getTransaction().rollback();

}

}

}

日志实现类:

package com.bjpowernode.usermgr.manager;

import org.hibernate.Session;

import com.bjpowernode.usermgr.domain.Log;

import com.bjpowernode.usermgr.util.HibernateUtils;

public class LogManagerImpl implements LogManager {

public void addLog(Log log) {

//获取当前线程的Session

HibernateUtils.getSessionFactory().getCurrentSession().save(log);

}

}

测试类

package com.bjpowernode.usermgr.manager;

import junit.framework.TestCase;

import com.bjpowernode.usermgr.domain.User;

public class UserManagerImplTest extends TestCase {

public void testAddUser() {

UserManager userManager=new UserManagerImpl();

User user=new User();

user.setName("张三");

userManager.addUser(user);

}

注意:

1.openSession和getCurrentSession的区别?

*openSession必须关闭,currentSession在事务结束后自动关闭

*openSession没有和当前线程绑定,currentSession和当前线程绑定

2.如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:

*如果是本地事务(jdbc事务)

thread

*如果是全局事务(jta事务)

jta

全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。

本地事务:在单个EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

总结

以上就是本文关于Hibernate中获取Session的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:

hibernate通过session实现增删改查操作实例解析

快速了解Hibernate中的Session

Hibernate使用hbm.xml配置映射关系解析

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:物联网API 网关(物联网网关方案)
下一篇:微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
相关文章

 发表评论

暂时没有评论,来抢沙发吧~