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
|
Web
& Java EE, 版本
6.1
|
|
Java
Developer Kit(JDK)
|
版本 6
或版本 5
|
|
GlassFish
应用服务器
|
V2
|
在学习本教程之前,您需要在 IDE 中注册 GlassFish / Sun Java System Application Server 的本地实例。GlassFish 应用服务器绑定在 IDE 中。如果您在安装 IDE 时安装了应用服务器选项,则服务器应该已经通过了 IDE 注册。
前提条件
本文档假定您拥有以下技术的基本知识或者具备相关编程经验:
建立 Web 应用程序项目
本练习的目的是创建 ZooApp
Web 应用程序项目。此应用程序将利用新增的
Java
持久性模型的功能。其中一项功能就是,实体对象可以成为简单的
Java
类,因此不再需要将它们放置在 EJB
模块中并将其打包到 EAR
文件中。这意味着,我们可以直接在 Web
应用程序内创建实体类。
在本教程中,我们将使用 JavaServer
Faces (JSF) 页面中的表单读取和修改数据库中的数据。
选择“文件”>“新建项目”(Ctrl-Shift-N)。从
"Web"
类别中选择“Web
应用程序”,然后单击“下一步”。
键入
ZooApp
作为项目名称并设置项目位置。
如果“使用指定文件夹”选项为选中状态,则取消选中它。
(在本教程中,我们不用将项目库复制到一个专门的文件夹中,因为不需要与其他用户共享库。)
单击“下一步”按钮。
将服务器设置为
GlassFish,并将
Java
EE 版本设置为
Java
EE 5。单击“下一步”。
选中 "JavaServer
Faces" 复选框,然后单击“完成”。
小结
在本练习中,您创建了一个将包含实体类的 Java
EE 5 Web 应用程序。
创建持久性单元
在本练习中,我们将创建一个持久性单元,目的在于通知容器哪些实体类需要由实体管理器进行管理,以及这些实体需要使用哪些数据源信息。
我们通过在 persistence.xml(将在
Web
模块中创建此文件)中定义持久性单元的属性来创建持久性单元。指定持久性单元的名称后,将指定持久性提供程序,它包含容器将用于管理实体实例的
API。此外,还需要指定数据源和表生成策略。我们将使用“新建持久性单元”向导创建持久性单元。
也可以在“新建 -
实体类”向导中创建持久性单元。创建实体类时,如果不存在持久性单元,该向导将提示我们进行创建。
创建持久性单元
在“项目”窗口中右键单击
"ZooApp"
Web 应用程序节点,然后选择“新建”>“文件/文件夹”以打开“新建文件”向导。
从“持久性”类别中,选择“持久性单元”,然后单击“下一步”。
保留默认的持久性单元名称。
对于“持久性提供程序”,使用 TopLink(默认)。
默认提供程序是 TopLink
Essential.jar。TopLink
Essential.jar
包含 Java
持久性的库。并且实体管理器位于 TopLink
Essential.jar 中。
对于“数据源”,使用默认的数据源 jdbc/sample.
数据源 jdbc/sample
已配置为与绑定在
GlassFish
应用服务器中的
Java
DB 数据库连接。如果您为数据库创建了数据源,也可以使用另外的数据库。
检查是否为持久性单元选中了“使用
Java
事务
API”,以及“表生成策略”是否设置为“创建”,以便在部署应用程序时创建基于实体类的表。
单击“完成”按钮。
单击“完成”后,IDE
将创建
persistence.xm,并在源代码编辑器中将其打开。通过单击源代码编辑器工具栏中的
"XML",可以查看
persistence.xm
的 XML。此文件包含了
Java
EE 5 容器管理应用程序的实体和持久性所需的所有信息。
小结
在本练习中,您创建了一个持久性单元,用来指定数据源、要永久保存的实体类以及容器将用于管理实体生命周期的实体管理器。
创建实体类
在本练习中,我们将创建两个实体类,即 Animal.java
和
Pavilion.java,它们用于表示要创建的关系数据库中的表。此外,还将在类中定义一些字段来表示数据。Java
持久性规范允许我们使用注释为容器提供有关字段的信息,如对象关系映射信息。
创建 Animal
和
Pavilion
实体类
首先,我们将创建实体类 Animal
和
Pavilion。它们用于表示数据库中的
ANIMAL
和 PAVILION
表。
在创建实体类时,IDE
会添加
@Entity注释将该类定义为实体类。创建类后,我们将在类中创建字段以表示表中所需的数据,并使用注释提供有关一些字段的其他信息。每个实体类都必须具有一个主键。在创建实体类时,IDE
会添加 @Id
注释以声明要用作主键的字段。此外,IDE
还会添加 @Generated
注释以指定
主 Id
的键生成策略。
要创建实体类,请执行以下操作:
右键单击 "ZooApp"
项目节点,然后选择“新建”>“其他”。
从“持久性”类别中,选择“实体类”,然后单击“下一步”。
键入 Animal
作为类名,键入 entity
作为包名,并将“主键类型”保留为
Long。单击“完成”按钮。
重复上述步骤,在 entity
源包中创建 Pavilion
类。
单击“完成”后,IDE
将在源代码编辑器中打开新建的实体类。如果您在“项目”窗口中展开“源包”下面的
entity
节点,则可以看到
Animal
和 Pavilion
实体类。
定义 Animal
类中的字段
在编辑器中打开 Animal
类,然后执行以下操作:
将以下字段声明(粗体)添加到类中:
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;
在源代码编辑器中单击鼠标右键,选择“插入代码(Alt-Insert)”并选择“Getter
和 Setter”打开“生成
Getters
和 Setters”对话框。
在“生成 Getters
和 Setters”对话框中,选择所有字段并单击“生成”。

在“生成 Getters
和
Setters”对话框中,您可以使用键盘中的向上箭头将所选项目移动
Animal
项目中,然后敲击空格栏选择
Animal
中的所有字段。
现在我们希望更改将在 Animal
表中创建的其中一列的名称。我们希望该列的名称是
animalName
而不是 name。通过在
name
字段声明之上添加以下注释,可以使用注释来指定生成列的名称:
@Column(name="animalName")
private String name;
在 name
字段中添加
@Column
注释时,IDE
将在类标识符的左侧弹出警告。单击警告图标并选择“统一”字段访问。
单击“统一”字段访问时,IDE
会移动 getId
getter 中的 @Id
和 @GeneratedValue
注释,使它们位于
private
Long id 的正上方。
我们还希望 Animal
表中的 pavilion
列具有多对一的关系。通过在 pavilion
声明之上添加以下注释,可以实现这一目的:
@ManyToOne
private Pavilion pavilion;
按 Alt-Shift-F
组合键为类生成所有必要的 import
语句。
保存更改。
在下一步中,我们将定义 pavilion
实体类中的字段。
定义
Pavilion
类中的字段
在编辑器中打开 Pavilion
类,然后执行以下操作:
将以下字段声明(粗体)添加到类中:
public class Pavilion implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String name;
private String address;
private Collection <Animal> animals;
在 name
声明之上添加以下注释以更改生成列的名称:
@Column(name="pavilionName")
private String name;
在 animals
声明之上添加以下注释,为实体指定一对多的关系:
@OneToMany(mappedBy="pavilion")
private Collection <Animal> animals;
在编辑器中单击鼠标右键,选择“插入代码(Alt-Insert)”并选择“Getter
和 Setter”。
在“生成 Getters
和 Setters”对话框中,选择所有字段并单击“生成”。
单击警告图标并统一字段访问(方法同
Animal
类)。
按 Alt-Shift-F
组合键生成所有缺少的 import
语句。
保存更改。
小结
在本练习中,您创建了两个实体类并定义了字段,而且还使用注释定义了在部署应用程序时将在表中生成的某些列的属性。
创建 Web
接口
现在我们希望创建一些简单的 Web
页,以查看是否创建了数据库表以及是否可以添加数据。我们将为应用程序添加
Java
Server Faces (JSF) 页,并使用“通过实体类创建
JSF
页”向导快速创建一个简单的 Web
接口。
从主菜单中,选择“文件”>“新建文件”。从“持久性”类别中,选择“通过实体类创建
JSF
页”,然后单击“下一步”。
在“新建 -
通过实体类创建 JSF
页”向导中,单击“全部添加”以选择两个实体类,然后单击“下一步”。
将“JSF
页文件夹”文本字段保留为空,以便在默认位置保存
JSF
文件。
将 entity
指定为已生成类的包,然后单击“完成”。
单击“完成”后,IDE
将生成所需的 JavaServer
Faces 文件,以便我们可以运行并测试
ZooApp。
运行项目
在本练习中,我们将部署 ZooApp
Web 应用程序项目并测试该应用程序。
启动 Java
DB 数据库,方法是:选择“工具”>“Java
DB 数据库”>“启动
Java
DB 服务器”。
右键单击 "ZooApp"
项目节点,然后选择“运行项目”。
单击“运行项目”后,将在浏览器中打开一个页面,您可以通过该页面包含的菜单,查看场馆
(Pavilions)
和动物 (Animals)
的列表。
您还可以添加、编辑或删除动物 (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
项目中:
在“项目”窗口中,右键单击
Web
应用程序节点,然后选择“属性”。
在“项目属性”对话框的“类别”窗格中选择“框架”,然后单击“添加”
在“选择框架”对话框中,选择
"Java
Server Faces",然后单击“确定”。
在“项目属性”对话框中,单击“确定”以关闭窗口。
将 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
不正确,请执行以下操作:
删除实体类的
Controller
和 Converter
类。
删除“项目”窗口中“Web
页面”节点下的
animal
和 pavilion
目录。
修复
Pavilion
实体类中的 getters
和 setters
方法。
使用“通过实体类生成 JSF
页面”向导重新生成
JSF
页面和 Controllers
及 Converter
类。
将反馈发送给我们
未来计划
有关使用 NetBeans
IDE 5.5 开发 Java
EE 应用程序的更多信息,请参见以下资源:
您可以在 Java
EE 5 教程
中找到更多关于使用 Java
持久性的信息。
要发送评论和建议、获取帮助,以及了解最新的
NetBeans
IDE Java EE 开发特性,请
加入
nbj2ee
邮件列表。