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

时间:2022-11-06 23:05:08

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

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

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

HibernateUtil管理Session的工具类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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;
    }
}

用户业务逻辑层

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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 LogManagerImpl();
            //保存日志
            logManager.addLog(log);
            session.getTransaction().commit();
        }
        catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
    }
}

日志实现类:

?
1
2
3
4
5
6
7
8
9
10
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);
    }
}

测试类

?
1
2
3
4
5
6
7
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();
?
1
2
3
  user.setName("张三");
  userManager.addUser(user);
}

注意:

1.openSession和getCurrentSession的区别?

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

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

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

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

<propertyname="hibernate.current_session_context_class">thread</property>

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

<propertyname="hibernate.current_session_context_class">jta</property>

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

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

总结

以上就是本文关于Hibernate中获取Session的两种方式代码示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/yingjiebohe/article/details/8283185