使用不同捆绑软件中的 JPA 访问数据

关于此任务

您需要先配置 JPA 捆绑软件并将数据源添加至 WebSphere® Application Server,才能访问另一个捆绑软件中的 JPA 持久性单元。例如,耗用 JPA 实体并显示和处理数据的 Web 应用程序捆绑软件。
提示:

请确保 JPA 持久性文件包含对 Java™ 事务 API (JTA) 和非 JTA 数据源的引用。

JPA 提供了两种事务模式来访问数据源:
jta-data-source
Java Transaction API (JTA) 资源模式依赖于全局事务。JTA 资源模式通常在 Enterprise JavaBeans (EJB) 会话面的作用域内使用。此配置允许会话 Bean 在 JPA 处理持久性映射时控制事务和安全上下文。在这种情况下,应用程序不使用 EntityTransaction 接口,而是依赖于全局事务在被访问时随全局事务一起列出的 EntityManager。
non-jta-data-source
在缺乏全局事务的情况下,将使用非 JTA 资源模式来处理单个资源。通常在 Web 应用程序或应用程序客户机的作用域中使用非 JTA 资源模式。应用程序通过 EntityTransaction 接口来控制与数据源之间的事务。

在 OSGi 应用程序的 persistence.xml 文件中,jta-data-sourcenon-jta-data-source 元素通过 Java 命名和目录接口 (JNDI) 查找(针对服务注册表的 JNDI 查询)或通过蓝图访问数据源。

如果在 persistence.xml 文件中未配置 JTA 和非 JTA 数据源,那么将使用为服务器配置的缺省 JTA 和非 JTA 数据源。缺省情况下,这些值是空值。某些 JPA 实体功能需要指定非 JTA 数据源。例如,自动实体身份生成。

过程

  1. 请确保已将实体和实体控制器软件包作为导出软件包添加至 manifest.mf:
    1. 双击清单:<project_name>,其中 <project_name> 是 JPA 捆绑软件项目的名称。捆绑清单将在编辑器中打开。
    2. 切换至“运行时”选项卡。验证是否已将实体和实体控制器软件包添加为导出软件包。
  2. 将非 JTA 数据源添加至 persistence.xml
    1. 在编辑器中打开 persistence.xml
    2. 在组件列表中,选择实体以显示该实体的详细信息。
    3. 在“非 JTA 数据源”字段中,输入非数据源的全局 JNDI 名称。例如,osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/blogdbnojta)
  3. 修改 getEntityManager() 方法。

    通过修改 getEntityManager() 方法,您将为 EntityManagerFactory 服务配置 JNDI 查询,因为 JPA 捆绑软件中的持久性单元不在 Java EE 环境中。

    还可以通过将实体管理器 Bean 设置为蓝图管理的 Bean 来配置 JNDI 查询。有关更多信息,请参阅 JPA 和 OSGi 应用程序

    1. 在编辑器中打开实体管理器 Bean。
    2. 找到 getEntityManager() 并按如下所示对其进行修改:
      private EntityManager getEntityManager() {
      		try {
      			emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
      		} catch (NamingException e) {
      // TODO Auto-generated catch block
      			e.printStackTrace();
      		}
      		
      		return emf.createEntityManager();
      	}
      要点: 在以下代码行中,确保持久性单元与 persistence.xml 中的持久性单元相匹配:
      emf = (EntityManagerFactory) new InitialContext().lookup("osgi:service/javax.persistence.EntityManagerFactory/(osgi.unit.name=jpaBundle)");
  4. 修正已生成的 InitialContextNamingException 的相关错误:
    1. 切换至“标记”视图。
    2. 对于每一个错误,请右键单击该错误并选择快速修复。遵循向导中的指示信息来导入必需的软件包。
  5. 将 JDBC 提供程序添加至 WebSphere Application Server 管理控制台:
    1. 切换至“服务器”视图。
    2. 右键单击服务器实例,然后选择启动
    3. 右键单击服务器实例,然后选择管理 > 运行管理控制台以打开管理控制台。
    4. 单击资源 > JDBC > JDBC 提供程序
    5. 在“JDBC 提供程序”页面中单击新建。这时,将打开“创建数据源”向导。
    6. 请遵循向导中的指示信息以创建 JDBC 提供程序。
    7. 保存更改。
  6. 将数据源定义添加至 WebSphere Application Server 管理控制台:
    1. 在管理控制台中,单击资源 > JDBC > 数据源以在控制台中打开“数据源”页面。
    2. 在“数据源”页面中,单击新建以使用针对 persistence.xml 中指定的 JTA 连接定义设置的 JNDI 名称来创建数据源定义。例如,jdbc/blogdb
    3. 在“数据源”页面中,单击新建以使用针对 persistence.xml 中指定的非 JTA 连接定义设置的 JNDI 名称来创建另一个数据源定义。例如,jdbc/blogdbnojta
    4. 创建非 JTA 连接的数据源之后,请单击管理控制台的“数据源”页面中非 JTA 连接的定义。这样会打开“配置”页面。
    5. 在“其他属性”部分中,单击 WebSphere Application Server 数据源属性
    6. 选择非事务性数据源 在应用程序服务器中,如果使用 <non-jta-data-source> 元素,那么要求对非事务数据源进行特殊配置。对应用程序服务器配置的数据源将不能用作 <non-jta-data-source>,这是因为由应用程序服务器配置的所有数据源都将自动随当前事务上下文列出。要防止这样的自动列出,请添加额外的数据源定制属性 nonTransactionalDataSource=true

结果

现在,您可以耗用 JPA 实体、显示和处理 JPA 数据,其中从 Web 应用程序捆绑软件访问 JPA 捆绑软件。
指示主题类型的图标 任务主题
信息中心的条款和条件 | 反馈

时间戳记图标 最近一次更新时间: 2014 年 4 月 17 日

文件名:taccessjpaoutbundle.html