使用 JPA 构建 Web 应用程序 (JSF)

  • 格式:doc
  • 大小:194.00 KB
  • 文档页数:17

教程:使用JPA 构建Web 应用程序(JSF) 版本:5/12/06∙简介∙所需软件∙安装与配置∙了解教程应用程序∙教程步骤∙第1 步:为实体加批注∙第2 步:配置持续性单元∙第3 步:使用JPA 实施服务∙第4 步:使用名称查询和动态查询∙第5 步:打包和部署∙打包Persistence.xml 文件∙利用Tomcat 5.x 进行打包和部署∙第6 步:生成数据库模式并进行填充∙第7 步:运行应用程序∙总结简介此教程将指导您完成使用EJB 3.0 Java 持续性API (JPA) 进行Web 应用程序的开发、打包和部署的基本步骤。

在应用程序中,Java Server Faces (JSF) 表示层将利用JPA获得EJB 3.0 容器以外的持续性。

图1-1显示了此教程使用的对象模型。

图1-1 教程对象模型“图1-1 教程对象模型”的描述有关JPA的更多信息,请参见:∙OTN 上的JPA∙JPA 批注参考∙TopLink JPA 扩展参考∙JSR-220 Enterprise JavaBeans v3.0 Java 持续性API 规范∙完整的JPA Javadoc所需软件∙JDK 1.5∙教程源代码(order-jsf-jpa.zip)∙关系数据库您可以使用任意的最新的关系数据库。

本教程使用的数据库是Oracle 数据库快捷版:∙Oracle 数据库快捷版- Linux 版∙Oracle 数据库快捷版- Windows 版请使用为您的数据库推荐的JDBC 驱动程序。

Oracle 数据库快捷版的JDBC 驱动程序位于<ORACLE_HOME>\jdbc\lib中。

∙Web 容器:您可以使用任意的Web 容器。

本教程假设您使用了以下Web 容器之一:∙Tomcat 版本5.x∙TopLink JPA单击上面的链接将下载一个TopLink JPA安装程序JAR 文件,如glassfish-persistence-installer-X.X-bXX.jar。

安装与配置在开始本教程之前,您必须安装并配置好所需的软件:1.安装JDK 5.02.安装教程应用程序。

∙将order-jsf-jpa.zip文件解压缩到您计算机上的一个目录中。

这是<TUTORIAL_HOME>目录。

解压缩完成后,应该包括以下文件:∙jpa-example.war - 用于进行部署的完整应用程序包。

∙jpa-example-src.jar - 所有非持续性源文件。

∙persistence-unit-src.jar - 所有持续性源文件,其中包括persistence.xml文件。

∙在<TUTORIAL_HOME>中创建一个子目录<WAR_HOME>,并将jpa-example.war文件解压缩到该子目录中。

有关教程应用程序的更多信息,请参见了解教程应用程序。

3.安装并设置您的关系数据库:∙安装Oracle 数据库快捷版- Linux 版∙Oracle 数据库快捷版- Windows 版∙Oracle 数据库快捷版入门∙将关系数据库JDBC 驱动程序添加到教程应用程序WAR 文件子目录<TUTORIAL_HOME>\<WAR_HOME>\WEB-INF\lib中。

4.安装并设置Web 容器:∙安装并设置Tomcat5.安装TopLink JPA:∙将TopLink JPA安装程序JAR 文件转移到临时目录中。

∙通过在命令行中输入以下命令来执行您所下载的TopLink JPA安装程序JAR 文件(必须使用JDK 1.5):java -jar glassfish-persistence-installer-X.X-bXX.jar∙向下滚动到许可协议的末尾,单击Accept。

安装程序会解开README、许可文件和TopLink Essential JAR 文件,如下所示:glassfish-persistence\READMEglassfish-persistence\3RD-PARTY-LICENSE.txtglassfish-persistence\toplink-essentials.jarglassfish-persistence\toplink-essentials-agent.jarglassfish-persistence\CDDLv1.0.txt∙将toplink-essentials.jar和toplink-essentials-agent.jar 添加到教程应用程序WAR 文件子目录<TUTORIAL_HOME>\<WAR_HOME>\WEB-INF\lib中。

了解教程应用程序教程应用程序及其所有必要组件都包含在解压缩到<TUTORIAL_HOME>\<WAR_HOME>目录的名为jpa-example.war的WAR 文件中(参见安装与配置)。

示例1-1显示了此WAR 文件的结构,表1-1描述了该文件中每个重要的子目录。

示例1-1 jpa-example.war 文件的结构imagesWEB-INFclasses/oracle/toplink/jpa/example/inventory/services/InventoryService.classOrderService.classservices/impl/JPAResourceBean.classManagedInventoryBean.classManagedOrderBean.classtools/DDLGenerator.classPopulator.classui/InventoryManagerBean.classlib/- JSF JARs- JDBC driver JARstoplink-essentials.jartoplink-essentials-agent.jarjpa-demo.jarfaces-config.xmlweb.xml*.jsp表1-1 jpa-example.war 文件的子目录教程步骤以下过程介绍了创建教程应用程序时的重要步骤:∙第1 步:批注实体∙第2 步:配置持续性单元∙第3 步:使用JPA 实施服务∙第4 步:使用命名查询和动态查询∙第5 步:打包和部署∙第6 步:生成数据库模式并进行填充∙第7 步:运行应用程序第 1 步:批注实体批注是使用元数据对Java 源代码进行修饰的一种简单、明确的方法,该元数据将被编译进相应的Java 类文件,在运行时期间由JPA持续性提供器对其进行解释以管理JPA行为。

使用JPA批注修饰持续性类可以为JPA持续性提供程序指明哪些类需要持续性,并且可以指定持续性类的详细内容。

在大多数情况下,您可以使用JPA的默认值。

本教程显示了必需的批注和一些普通的可选批注。

有关更多信息,请参见JPA 批注引用。

在本教程中,为实体使用批注的目的是:∙指定持续性类:@Entity∙指定关系数据库表:@Table∙指定主键:@Id∙指定数据库列的属性:@Column∙指定乐观锁定字段:@Version∙指定命名查询:@NamedQuery 和@NamedQueries指定持续性类:@Entity在本教程中,以下各类都由@Entity批注修饰:∙oracle.toplink.jpa.example.inventory.model.Item∙oracle.toplink.jpa.example.inventory.model.Inventory∙oracle.toplink.jpa.example.inventory.model.Order示例1-2显示了Item类的批注。

@Entity批注指示JPA持续性供应商管理这些类的持续性。

示例1-2 @Entity@Entitypublic class Item {...}默认情况下,一个实体的名称就是该实体所属类的名称。

您可以使用@Entity的属性name为实体指定其它的名称。

指定关系数据库表:@Table默认情况下,JPA持续性供应程序使用实体名称(参见指定持续性类:@Entity)作为关系数据库表的名称。

在本教程中,TopLink JPA持续性供应程序将基于此默认名称为Item和Inventory实体创建数据库表:即,为ITEM实体创建表Item,为INVENTORY实体创建表Inventory。

然而,您不能为Order实体创建名为ORDER的表,因为此名称是大多数关系数据库中的保留字。

在此情况下,我们使用@Table批注覆盖默认的表名,如示例1-3所示。

示例1-3 在Order.java 中使用@Table@Entity// specify table name as the default will be ORDER which is a reserved word@Table(name="ORDER_TABLE")...public class Order {...}或者,我们可以使用@Entity的属性name更改Order类的实体名称(指定持续性类:@Entity)。

在所有情况下,每个表中都将包含相应实体的所有持续性字段。

JPA指出,除非经过@Transient批注的修饰,否则一个实体的所有字段都是持续性字段。

指定主键:@Id每个实体都必须拥有一个主键:经过@Id批注修饰的字段或属性。

Order类的字段orderId被指定为实体的主键。

@GeneratedValue批持续性供应程序负责生成此字段唯一标识符的值,并对这些值进行管理和排示例1-4 在Order.java 中使用@Idpublic class Order {@Id@GeneratedValueprotected long orderId;...}如示例1-5所示,Inventory类的字段id被指定为实体的主键。

如Inventory方法setItem所示,由于Inventory实体从其Item中获得主键的值(参见示例1-5),所以此示例中不使用@GeneratedValue批注。

有关@Column批注的更多信息,参见指定数据库列的属性:@Column。

示例1-5 在Inventory.java 中使用@Idpublic class Inventory {@Id@Column(insertable=false, updatable=false)protected long id;...public void setItem(Item item) {this.item = item;this.id = item.getSKU();}...}如示例1-6所示,Item类的属性getSKU被指定为实体的主键。