快速业务通道

将遗留Hibernate应用程序迁移到OpenJPA和EJB 3.0(一) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

与 Hibernate 一样,处理 JVM 中客户机请求的所有线程都可以使用静态 EntityManagerFactory 实 例。如果需要多个实例,还可以定义静态映射。

createEntityManagerFactory() 在类路径(该类路径包含的持久单元名称与方法调用中指定的名称相 同)的 META-INF 文件夹中查找 persistence.xml。如果找到的 persistence.xml 使用的持久单元与给 定名称匹配,则 createEntityManagerFactory() 使用该文件中的元数据配置 EntityManagerFactory 实 例。如果没有找到具有匹配名称的 persistence.xml,则引发 javax.persistence.PersistenceException。

3. 会话管理

通常,应用程序收到客户机请求时,将从 SessionFactory 获取会话,并在请求结束时关闭会话,其 中请求可以是 HttpRequest 或对无状态会话 Bean 的调用等。会话提供处理事务和从数据库加载实体( 以及将实体存储到数据库)的方法。

Hibernate 应用程序通常管理该会话。为了达到目标,它们通常将会话与线程本地存储关联,这样无 需将会话作为参数传递到需要访问它的所有方法;相反,它们可以从线程本地存储中检索它。Hibernate 3.0.1 还提供了 getCurrentSession(),但是您通常会找到显式会话管理。

就异常而言,Hibernate 3.0 会引发未经检查的异常或运行时异常(对于 OpenJPA 也一样),这意味 着在方法签名中,大多数应用程序不会引发 Hibernate 异常;它们也不在自己的方法中捕获和处理 Hibernate 异常。当然,如果需要,仍可以捕获和处理它们。

您通常还会发现,在使用 Java SE 5 实现 OpenJPA 应用程序时,已使用 Java SE 1.4 实现了大多数 现有遗留 Hibernate 应用程序。

下面的示例使用 getSessionFactory() helper 方法获取创建/打开会话(或实体管理器)所需的会话 工厂(或实体管理器工厂)。(有关 getSessionFactory() 方法的详细信息,请参见运行时配置。)

Hibernate 约定

在 Hibernate 中,会话管理按照以下方式进行映射:

使用 ThreadLocal 获取当前会话。

使用 SessionFactory#openSession() 打开会话。

使用 Session#isOpen() and Session#close() 关闭会话。

将遗留Hibernate应用程序迁移到OpenJPA和EJB 3.0(一)(4)

时间:2011-09-18 Donald Vines

清单 3. Hibernate 会话管理

public class ORMHelper {   private static final ThreadLocal tls = new ThreadLocal();   public static void openSession() {    Session s = (Session) tls.get();    if (s == null) {      s = getSessionFactory ("test.cfg.xml").openSession();      tls.set(s);    }   }   public static Session getCurrentSession() {    return (Session) tls.get();   }   public static void closeSession() {    Session s = (Session)tls.get();     tls.set(null);    if (s != null && s.isOpen()) s.close();   }   ... }

OpenJPA 约定

在 OpenJPA 中,等效的 EntityManager 管理按照以下方式进行映射:

使用 ThreadLocal 获取当前实体管理器。

使用 EntityManagerFactory#createEntityManager() 打开会话。

使用 EntityManager#isOpen() 和 EntityManager#close() 关闭会话。

清单 4. OpenJPA 会话管理

public class ORMHelper{   private static final ThreadLocal tls = new ThreadLocal();   public static void openSession() {    EntityManager s = (EntityManager) tls.get();    if (s == null) {      s = getSessionFactory ("test").createEntityManager();      tls.set(s);    }   }    public static EntityManager getCurrentSession() {    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号