Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与Session息息相关.
Session对象是通过SessionFactory构建的,下面举个例子来介绍Hibernate两种获取session的方式。
日志,是编程中很常见的一个关注点.用户在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在一个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 LogManagerImpl(); //保存日志 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事务)
<propertyname="hibernate.current_session_context_class">thread</property>
*如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。
本地事务:在单个EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
总结
以上就是本文关于Hibernate中获取Session的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:
hibernate通过session实现增删改查操作实例解析
快速了解Hibernate中的Session
Hibernate使用hbm.xml配置映射关系解析
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
本文向大家介绍Android中EditText显示明文与密码的两种方式,包括了Android中EditText显示明文与密码的两种方式的使用技巧和注意事项,需要的朋友参考一下 效果图如下所述: 布局 EditText显示明文与密码的两种方式如下所述: 第一种方式 第二种方式 以上所述是小编给大家介绍的Android中EditText显示明文与密码的两种方式,希望对大家有所帮助,如果大家想了解更多内
本文向大家介绍Android 获取屏幕的多种宽高信息的示例代码,包括了Android 获取屏幕的多种宽高信息的示例代码的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍了Android 获取屏幕的多种宽高信息的示例代码,分享给大家,具体如下: 包含的宽高信息如下图所示: 在模拟器上获取到的数据: 08-26 07:19:32.712 7834-7834/com.czy.screeninfo E
本文向大家介绍C#获取本地IP的四种方式示例详解,包括了C#获取本地IP的四种方式示例详解的使用技巧和注意事项,需要的朋友参考一下 1.第一种方式 采用System.Net.Dns的GetHostAddress的方式,具体请看代码: 这种方式受到网络的影响,如果没有连接到网络,本地配置的部分IP是获取不到的,我也遇到一种情况是,电脑环境正常,就是获取不到,原因至今还不知道; 2.第二种方式 采用S
sp_sql_posts() 示例: <?php $tag='cid:6;field:post_title,post_content;order:listorder asc'; $posts=sp_sql_posts($tag); print_r($posts); $smeta=json_decode($vo['smeta'],true); //smeta处理方法,将其转化为数组 ?>
本文向大家介绍Hibernate三种状态和Session常用的方法,包括了Hibernate三种状态和Session常用的方法的使用技巧和注意事项,需要的朋友参考一下 我们知道hibernate的核心就是对数据库的操作,里面的核心接口就是org.hibernate.Session接口。要想对数据库操作我们就要理清楚对象在整个操作中的所属的状态(Transient,Persistent,Detach
本文向大家介绍python 获取网页编码方式实现代码,包括了python 获取网页编码方式实现代码的使用技巧和注意事项,需要的朋友参考一下 python 获取网页编码方式实现代码 然后import chardet 下面写了一个自动化检测的函数供检测Url连接,然后返回网页url的编码方式。 上面用到了chardet类的detect方法,返回字典,然后取出编码方式encoding 感谢阅读,希望能