EJB中使用Hibernate的方法以及常见问题

EJB中使用Hibernate的方法应该大家都会,不过许多人可能没注意下面几个问题,首先我们来看下面这段代码。

public class HibernateTestBean implements SessionBean ...{
  SessionContext sessionContext;
  SessionFactory sf;
  public void setSessionContext(SessionContext sessionContext) ...{
    this.sessionContext = sessionContext;
    try ...{
      InitialContext ctx = new InitialContext();
      sf=(SessionFactory) ctx.lookup("java:/hibernate/SessionFactory");
    } catch (NamingException ex) ...{
      ex.printStackTrace();
    }
  }
  public void tran()...{
    tran1();
    tran2();
  }
  public void tran1() ...{
    Session session=sf.getCurrentSession();
    Message msg=new Message();
    msg.setCreateTime(new Date());
    msg.setDetail("trans1");
    session.save(msg);
    System.out.println("Session:"+session.hashCode());
    session.flush();
    session.close();
  }
  public void tran2() ...{
   Session session=sf.getCurrentSession();
   Message msg=new Message();
   msg.setCreateTime(new Date());
   msg.setDetail("trans2");
   session.save(msg);
    System.out.println("Session:"+session.hashCode());
// throw new RuntimeException("wrong");
 }
……
}

注:EJB采用CMT,各方法的事务属性是required

客户端调用tran以上代码可以正确运行吗?

如果把tran1中的sf.getCurrentSession();改为sf.openSession()可以正确运行吗?

辨析:

1 上述代码是不能正确运行的,运行tran2时会抛出异常,告诉你session is closed.

其实这是应为getCurrentSession()会使用环境已有的Session,同时注意getCurrentSession()要在事务的环境中使用。

这是也许你一定会问,那么什么时候关闭Session呢?答案是事务完成的时候(提交或是回滚)。

2 如果上述代码tran1中的sf.getCurrentSession();改为sf.openSession()代码将可以正确运行。这是因为openSession()每次都会返回一个新的Session。而在tran2种的sf.getCurrentSession()并不会使用tran1中的session,而是会使用当前事务环境中的默认的session.

也许你会问如果tran2种的调用抛出RuntimeException,tran1所作的操作还可以回滚吗?

答案是仍然可以回滚的.

时间: 2024-11-03 10:28:45

EJB中使用Hibernate的方法以及常见问题的相关文章

在EF中使用MySQL的方法及常见问题_Mysql

有时需要在网上租用空间或数据库,Mysql成本低一些,所以想将sql server转成mysql-- 注意:在安装Mysql时要选择文字集为utf8,否则将不能使用中文(当前也可以在创建数据库时使用utf8,不过我不知道在ef生成数据库时如何设置,希望高手指点) 一.在项目中引用mysql的EF包 通过NuGet包管理器安装:EntityFramework6.1.3.MySql.Data.Entity6.9.8 也可以用nuget的命令行加入: Install-Package MySql.Dat

在GNOME的ubuntu桌面环境中安装KDE的方法以及常见问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/586057 安装KDE的方法: Methord1: sudo apt-get install kubuntu-desktop Methord2: sudo apt-get install kde 删除KDE的方法: apt-get --purge remove kde apt-get --purge remove k

controller中获得hibernate的session方法

问题描述 controller中获得hibernate的session方法 环境:Spring+Hibernate事务由org.springframework.orm.hibernate4.HibernateTransactionManager管理需求是这样的,带有@Transactional注解的Service类中有两个方法:1. check()----用来验证数据2. insert()----用来插入数据我想在controller方法中显式声明一个事物并把check()和insert()放入

ssh整合-关于ssh中hibernate生成方法从Action中调用报错main调用不报错

问题描述 关于ssh中hibernate生成方法从Action中调用报错main调用不报错 看图学生求解决没遇到过!我建测试类用main方法进来一点问题都没有正常输出i=1 解决方案 报的什么错,贴出来,,, 解决方案二: 你确定text的userinfo和action的userinfo的内容一样吗? 你在findUserinfonamepwd方法中将name和pwd打印出来看看. 我怀疑你action的参数userinfo是null或者userinfo实例化了,但是name或者pwd是null

解析eclipse下生成Hibernate DAO中的几个方法

        前几天用eclipse下生成的Hibernate DAO做了一个实现的增删查改的小例子,在这里解释下生成DAO中的几个方法到底是做什么用的.这里我将以注释的形式在下面的这段java代码中解释. package dao;/** *//** * 很简单引入你要用的包 */import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;imp

在Eclipse中使用Hibernate插件

最近,我开始使用Eclipse作为我的开发环境.这部分是由于它支持我开发时所使用的许多平台,部分是由于Eclipse是开放的可扩展环境的杰出代表,大家都可以为它的发展贡献自己的力量.我正开始调查人们已经提出的一些扩展.例如,我使用了一个叫做XMLBuddy的小插件来处理XML文件,它很有用.所以,我开始好奇是否有人已经编写了使用Hibernate的插件,最近在编写Developer's Notebook一书时,我做了大量这方面的工作.结果我了解到,这方面确实有一些工作正在进行,本文将探讨其中之一

Java项目中使用Hibernate处理数据

数据|项目 对象-关系映射(O/R映射)是许多软件开发项目的常见需求.数据持久化过程中所涉及到的活动是非常乏味且易于出错的.如果考虑到不可避免的需求变化,我们就面临很大的麻烦:数据存储结构必须与源代码保持同步.再加上移植性问题,事情就变得非常复杂. 而Hibernate可以帮助我们轻松地在永久性存储介质中保存数据,而不需要在选择存储.安装或配置类型方面浪费太多精力.Hibernate允许我们存储任何类型的对象,因此,应用程序不需要知道其数据将使用Hibernate进行持久化.当然,这里提到的任何

Hibernate优化方法

Hibernate优化方法一:批量修改和删除 在Hibernate 2中,如果需要对任何数据进行修改和删除操作,都需要先执行查询操作,在得到要修改或者删除的数据后,再对该数据进行相应的操作处理.在数据量少的情况下采用这种处理方式没有问题,但需要处理大量数据的时候就可能存在以下的问题: ◆占用大量的内存. ◆需要多次执行update/delete语句,而每次执行只能处理一条数据. 以上两个问题的出现会严重影响系统的性能.因此,在Hibernate 3中引入了用于批量更新或者删除数据的HQL语句.这

在Java中进行事务处理的方法

摘要 本文介绍在Java中进行事务处理的方法,通过实例分别讲述了如何采用JavaBean.Ejb组件实现J2EE应用服务器支持的JDBC事务.JTA(Java Transaction API)事务. 关键词 JavaBean,EJB, 数据库,事务处理,JTA JavaBean JavaBean是用Java语言编写的与平台无关的组件.它是描述Java的软件组件模型,有点类似于Microsoft的COM组件的概念.在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaB