corner imagecorner image
FeaturesPluginsDocs & SupportCommunityPartners

Java EE 5 平台中的 Java 持久性

本文档将介绍有关使用 Java™ 持久性开发 Web 应用程序的基础知识。Java 持久性 API 是作为 Java EE 5 平台的一部分引入的。在本教程中,您将创建一个简单的 Web 应用程序项目。我们将在项目中使用持久性,但是 Java 持久性 API 允许我们在无需创建 EJB 模块的情况下使用持久性。

在项目中使用 Java 持久性可以大大简化应用程序的开发,因为您不需要配置部署描述符为持久性字段或属性提供对象关系映射信息,而可以使用注释直接在简单的 Java 类中定义这些属性。

实体持久性是通过 EntityManager API 来管理的。EntityManager API 用于处理持久性上下文,而每个持久性上下文是一组实体实例。在开发应用

程序时,您可以在类中使用注释来指定实体实例的持久性上下文实例,然后通过容器处理实体实例的生命周期。

本文档将使用 NetBeans IDE 6.1 发行版。

预计时间:15 分钟

教程练习

本页面内容适用于 NetBeans IDE 6.1

要学习本教程,您需要使用以下技术和资源。

软件或资源

所需版本

NetBeans IDE

Web & Java EE, 版本 6.1

Java Developer Kit(JDK)

版本 6 或版本 5

GlassFish 应用服务器

V2

在学习本教程之前,您需要在 IDE 中注册 GlassFish / Sun Java System Application Server 的本地实例。GlassFish 应用服务器绑定在 IDE 中。如果您在安装 IDE 时安装了应用服务器选项,则服务器应该已经通过了 IDE 注册。

前提条件

本文档假定您拥有以下技术的基本知识或者具备相关编程经验:

  • Java 编程

  • NetBeans IDE

建立 Web 应用程序项目

本练习的目的是创建 ZooApp Web 应用程序项目。此应用程序将利用新增的 Java 持久性模型的功能。其中一项功能就是,实体对象可以成为简单的 Java 类,因此不再需要将它们放置在 EJB 模块中并将其打包到 EAR 文件中。这意味着,我们可以直接在 Web 应用程序内创建实体类。

在本教程中,我们将使用 JavaServer Faces (JSF) 页面中的表单读取和修改数据库中的数据。

  1. 选择“文件”>“新建项目”(Ctrl-Shift-N)。从 "Web" 类别中选择“Web 应用程序”,然后单击“下一步”。

  2. 键入 ZooApp 作为项目名称并设置项目位置。

  3. 如果“使用指定文件夹”选项为选中状态,则取消选中它。
    (在本教程中,我们不用将项目库复制到一个专门的文件夹中,因为不需要与其他用户共享库。)
    单击“下一步”按钮。

  4. 将服务器设置为 GlassFish,并将 Java EE 版本设置为 Java EE 5。单击“下一步”。

  5. 选中 "JavaServer Faces" 复选框,然后单击“完成”。

小结

在本练习中,您创建了一个将包含实体类的 Java EE 5 Web 应用程序。

创建持久性单元

在本练习中,我们将创建一个持久性单元,目的在于通知容器哪些实体类需要由实体管理器进行管理,以及这些实体需要使用哪些数据源信息。

我们通过在 persistence.xml(将在 Web 模块中创建此文件)中定义持久性单元的属性来创建持久性单元。指定持久性单元的名称后,将指定持久性提供程序,它包含容器将用于管理实体实例的 API。此外,还需要指定数据源和表生成策略。我们将使用“新建持久性单元”向导创建持久性单元。

也可以在“新建 - 实体类”向导中创建持久性单元。创建实体类时,如果不存在持久性单元,该向导将提示我们进行创建。

创建持久性单元

  1. 在“项目”窗口中右键单击 "ZooApp" Web 应用程序节点,然后选择“新建”>“文件/文件夹”以打开“新建文件”向导。

  2. 从“持久性”类别中,选择“持久性单元”,然后单击“下一步”。

  3. 保留默认的持久性单元名称。

  4. 对于“持久性提供程序”,使用 TopLink(默认)。

    默认提供程序是 TopLink Essential.jarTopLink Essential.jar 包含 Java 持久性的库。并且实体管理器位于 TopLink Essential.jar 中。

  5. 对于“数据源”,使用默认的数据源 jdbc/sample.

    数据源 jdbc/sample 已配置为与绑定在 GlassFish 应用服务器中的 Java DB 数据库连接。如果您为数据库创建了数据源,也可以使用另外的数据库。

  6. 检查是否为持久性单元选中了“使用 Java 事务 API”,以及“表生成策略”是否设置为“创建”,以便在部署应用程序时创建基于实体类的表。

  7. 单击“完成”按钮。

新建持久性单元向导

单击“完成”后,IDE 将创建 persistence.xm,并在源代码编辑器中将其打开。通过单击源代码编辑器工具栏中的 "XML",可以查看 persistence.xm 的 XML。此文件包含了 Java EE 5 容器管理应用程序的实体和持久性所需的所有信息。

小结

在本练习中,您创建了一个持久性单元,用来指定数据源、要永久保存的实体类以及容器将用于管理实体生命周期的实体管理器。

创建实体类

在本练习中,我们将创建两个实体类,即 Animal.javaPavilion.java,它们用于表示要创建的关系数据库中的表。此外,还将在类中定义一些字段来表示数据。Java 持久性规范允许我们使用注释为容器提供有关字段的信息,如对象关系映射信息。

创建 AnimalPavilion 实体类

首先,我们将创建实体类 AnimalPavilion。它们用于表示数据库中的 ANIMALPAVILION 表。

在创建实体类时,IDE 会添加 @Entity注释将该类定义为实体类。创建类后,我们将在类中创建字段以表示表中所需的数据,并使用注释提供有关一些字段的其他信息。每个实体类都必须具有一个主键。在创建实体类时,IDE 会添加 @Id 注释以声明要用作主键的字段。此外,IDE 还会添加 @Generated 注释以指定

主 Id 的键生成策略。


要创建实体类,请执行以下操作:

  1. 右键单击 "ZooApp" 项目节点,然后选择“新建”>“其他”。

  2. 从“持久性”类别中,选择“实体类”,然后单击“下一步”。

  3. 键入 Animal 作为类名,键入 entity 作为包名,并将“主键类型”保留为 Long。单击“完成”按钮。

  4. 重复上述步骤,在 entity 源包中创建 Pavilion 类。

单击“完成”后,IDE 将在源代码编辑器中打开新建的实体类。如果您在“项目”窗口中展开“源包”下面的 entity 节点,则可以看到 AnimalPavilion 实体类。

定义 Animal 类中的字段

在编辑器中打开 Animal 类,然后执行以下操作:

  1. 将以下字段声明(粗体)添加到类中:

    public class Animal implements Serializable {
    
     private static final long serialVersionUID = 1L;
     private Long id;
     private String name;
     private String kind;
     private String weight;
     private Pavilion pavilion;
  2. 在源代码编辑器中单击鼠标右键,选择“插入代码(Alt-Insert)”并选择“Getter 和 Setter”打开“生成 Getters 和 Setters”对话框。

  3. 在“生成 Getters 和 Setters”对话框中,选择所有字段并单击“生成”。
    生成 Getters 和 Setters 对话框

    在“生成 Getters 和 Setters”对话框中,您可以使用键盘中的向上箭头将所选项目移动 Animal 项目中,然后敲击空格栏选择 Animal 中的所有字段。

  1. 现在我们希望更改将在 Animal 表中创建的其中一列的名称。我们希望该列的名称是 animalName 而不是 name。通过在 name 字段声明之上添加以下注释,可以使用注释来指定生成列的名称:

     @Column(name="animalName")
     private String name;
  2. name 字段中添加 @Column 注释时,IDE 将在类标识符的左侧弹出警告。单击警告图标并选择“统一”字段访问。
    显示统一字段弹出窗口的编辑器

    单击“统一”字段访问时,IDE 会移动 getId getter 中的 @Id@GeneratedValue 注释,使它们位于 private Long id 的正上方。

  3. 我们还希望 Animal 表中的 pavilion 列具有多对一的关系。通过在 pavilion 声明之上添加以下注释,可以实现这一目的:

     @ManyToOne
     private Pavilion pavilion;
  4. 按 Alt-Shift-F 组合键为类生成所有必要的 import 语句。

  5. 保存更改。

在下一步中,我们将定义 pavilion 实体类中的字段。

定义 Pavilion 类中的字段

在编辑器中打开 Pavilion 类,然后执行以下操作:

  1. 将以下字段声明(粗体)添加到类中:

    public class Pavilion implements Serializable {
    
     private static final long serialVersionUID = 1L;
     private Long id;
     private String name;
     private String address;
     private Collection <Animal> animals;
  2. name 声明之上添加以下注释以更改生成列的名称:

     @Column(name="pavilionName")
     private String name;
  3. animals 声明之上添加以下注释,为实体指定一对多的关系:

     @OneToMany(mappedBy="pavilion")
     private Collection <Animal> animals;
  4. 在编辑器中单击鼠标右键,选择“插入代码(Alt-Insert)”并选择“Getter 和 Setter”。

  5. 在“生成 Getters 和 Setters”对话框中,选择所有字段并单击“生成”。
    生成 Getters 和 Setters 对话框

  6. 单击警告图标并统一字段访问(方法同 Animal 类)。

  7. 按 Alt-Shift-F 组合键生成所有缺少的 import 语句。

  8. 保存更改。

小结

在本练习中,您创建了两个实体类并定义了字段,而且还使用注释定义了在部署应用程序时将在表中生成的某些列的属性。

创建 Web 接口

现在我们希望创建一些简单的 Web 页,以查看是否创建了数据库表以及是否可以添加数据。我们将为应用程序添加 Java Server Faces (JSF) 页,并使用“通过实体类创建 JSF 页”向导快速创建一个简单的 Web 接口。

  1. 从主菜单中,选择“文件”>“新建文件”。从“持久性”类别中,选择“通过实体类创建 JSF 页”,然后单击“下一步”。

  2. 在“新建 - 通过实体类创建 JSF 页”向导中,单击“全部添加”以选择两个实体类,然后单击“下一步”。

  3. 将“JSF 页文件夹”文本字段保留为空,以便在默认位置保存 JSF 文件。

  4. entity 指定为已生成类的包,然后单击“完成”。
    通过实体类新建 JSF 页面向导

单击“完成”后,IDE 将生成所需的 JavaServer Faces 文件,以便我们可以运行并测试 ZooApp。

运行项目

在本练习中,我们将部署 ZooApp Web 应用程序项目并测试该应用程序。

  1. 启动 Java DB 数据库,方法是:选择“工具”>“Java DB 数据库”>“启动 Java DB 服务器”。

  2. 右键单击 "ZooApp" 项目节点,然后选择“运行项目”。

单击“运行项目”后,将在浏览器中打开一个页面,您可以通过该页面包含的菜单,查看场馆 (Pavilions) 和动物 (Animals) 的列表。

生成 Getters 和 Setters 对话框

您还可以添加、编辑或删除动物 (Animals) 和场馆 (Pavilions) 数据。

小结

在本练习中,您生成了为 Java EE 5 平台开发的 ZooApp Web 应用程序,然后部署并测试了该 Web 应用程序。

故障排除

下面是您创建项目时可能会遇到的一些问题。

使用“新建 - 通过实体类创建 JSF 页”向导时的问题

使用该向导通过实体类创建 JSF 页时,您可能会在向导中看到以下错误消息:

This wizard can only be used in a Web project with JSF support.

如果看到此消息,则需要检查是否已将 Java Server Faces 框架添加到项目属性中。通过执行以下操作,可以将 Java Server Faces 支持添加到 Web 项目中:

  1. 在“项目”窗口中,右键单击 Web 应用程序节点,然后选择“属性”。

  2. 在“项目属性”对话框的“类别”窗格中选择“框架”,然后单击“添加”

  3. 在“选择框架”对话框中,选择 "Java Server Faces",然后单击“确定”。

  4. 在“项目属性”对话框中,单击“确定”以关闭窗口。

将 JSF 框架添加到项目属性后,您应该能够使用该向导创建 JSF 页了。

修改 Pavilion 数据时遇到 IllegalArgumentException

如果您遇到以下异常:

java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(animals). Found null.

问题可能是由 Pavilion 类中不正确的 Collection <Animal> getter setter 方法造成的。

确保 Collection <Animal> getters setters 方法如下所示:

public Collection<Animal> getAnimals() {
 return animals;
}

public void setAnimals(Collection<Animal> animals) {
 this.animals = animals;
}

如果您项目中的 getters 和 setters 不正确,请执行以下操作:

  1. 删除实体类的 Controller 和 Converter 类。

  2. 删除“项目”窗口中“Web 页面”节点下的 animalpavilion 目录。

  3. 修复 Pavilion 实体类中的 getters 和 setters 方法。

  4. 使用“通过实体类生成 JSF 页面”向导重新生成 JSF 页面和 Controllers 及 Converter 类。


将反馈发送给我们



未来计划

有关使用 NetBeans IDE 5.5 开发 Java EE 应用程序的更多信息,请参见以下资源:

您可以在 Java EE 5 教程 中找到更多关于使用 Java 持久性的信息。

要发送评论和建议、获取帮助,以及了解最新的 NetBeans IDE Java EE 开发特性,请 加入 nbj2ee 邮件列表

Companion
Projects:
MySQL Database Server   GlassFish Community: an Open Source Application Server   Open Solaris  Open JDK: an Open SourceJDK   Mobile & Embedded Community     Sponsored by 
Sponsored by Sun Microsystems