浏览 1768 次
锁定老帖子 主题:EJB2.1集成HIBERNATE3.2
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-17
最后修改:2009-12-17
公司一个老的系统, 基于EJB2.1开发,容器是jboss4.01, 事务管理使用JDBC, 就是再一SLSB里把获得connection传递到每个DAO中.如下: try{ conn = DBManager.getConnection(); XXXDao dao1 = new XXXDao (conn); rtnSet = (DataSet)dao1 .getDetailList(condSet,SUI); YYYYDao dao2 = new YYYYDao (conn); dao.insert(dataSet01); conn.commit(): } catch(Exception ex){ conn.rollback(): } 近日, 系统加入了hibernate3.2, 对其持久层进行重构了一下,动手之前,分析一下: 如果再EJB2.1中使用hibernate, 我们就要使用JTA事务, 当然事务的管理有sessionbean来控制, EJB中有CMT, BMT两种事务管理方式, CMT当然是最方便的,只是配置一下,就可以使用了, 只是再老的系统中sessionbean的配置文件都是: <transaction-type>Bean</transaction-type> 为了不更改以前的代码, 我们这里选择BMT. 1. 先下载所需的开发包, hibernate3 所需的基本包, 还有ejb3-persistence.jar放到类路径,引用路径,配置好开发环境. 2.接下来配置: hibernate.cfg.xml, 其他配置参照说明, 重点是下面的配置: <!-- BMT / JTA Transaction JBoss--> <property name="connection.autocommit">true</property> <property name="transaction.manager_lookup_class"> org.hibernate.transaction.JBossTransactionManagerLookup </property> <property name="transaction.factory_class"> org.hibernate.transaction.JTATransactionFactory </property> <property name="jta.UserTransaction">java:comp/UserTransaction</property> 3. 配置好了以后, 创建HibernateUtil private static SessionFactory factory; static { try { // 读取注解 Configuration cfg = new AnnotationConfiguration().configure("hibernate.cfg.xml"); factory = cfg.buildSessionFactory(); } catch (Exception e) { e.printStackTrace(); } } 4. 引用泛型DAO接口(IDAO)还有hibernate实现(DAOHibernate),这里不多说, 论坛有很多详细介绍. 5. 再SLSB中获得JTA事务, 因为我们使用的是BMT, 所以使用UserTransaction 来启动,结束JTA事务:
UserTransaction utx = this.sessionContext.getUserTransaction();
6. 再sessionbean的方法中使用如下:
try{
utx.begin(); //老系统中以前的dao测试 conn = DBManager.getConnection(); fidao = new FundInDaoImpl(conn); ds = (DataSet) fidao.getCustomerInfo(compnayCode, customerName); log.info(ds.getDataRowCnt()); //利用hibernate实现对某个数据库的数据访问操作 UserDAO udao = new UserDAOImpl(); User user = new User(); user.setId((long)1); user.setUserAge(100); user.setUserName("test9"); udao.save(user); //一个测试的DAO, 跨类的 UserDaoOne done = new UserDaoOne(); done.delete(); utx.commit(): }catch(Exception ex){ utx.rollback(); } OK, 搞定, 这样我们既兼顾了以前的实现, 新的模块也可以使用hibernate来持久, 经过了一些测试, 不知道这样的配置再以后的过程中是否会出现问题. 接下来,想把EJB3和EJB2放在一个容器中, 不知道是否可以支持, 喜欢注解带来的方便, 然后一步步的把事务改成CMT.
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |