在 Visual Web JSF 应用程序中使用 Hibernate
在本教程中,使用 NetBeans IDE 来创建和部署显示数据库中数据的 Web 应用程序。Web 应用程序将 Hibernate 框架用作持久层以使 Java 对象持久化到某个关系数据库中。
Hibernate 是一个为对象关系映射 (ORM) 提供工具的框架。本教程演示如何向 IDE 中添加对 Hibernate 框架的支持以及如何创建所需的 Hibernate 文件以使用 Hibernate 使 Plain Old Java Object (POJO) 持久化。有关使用 Hibernate 的详细信息,请参阅 hibernate.org 上的 Hibernate 文档。
创建 Java 对象并将应用程序配置为使用 Hibernate 之后,向 Web 页中添加 Visual Web JSF 组件以显示数据。要了解如何使用 Visual Web JSF 组件,可能需要阅读 NetBeans Visual Web JSF 开发入门。
目录
要学习本教程,您需要使用以下软件和资源。
| NetBeans IDE |
Web & Java EE 版本 6.1 |
| Java Development Kit (JDK) |
版本 6 或 版本 5 |
JavaServer Faces 组件/ Java EE 平台 |
1.2/Java EE 5* 或 1.1/J2EE 1.4
|
| GlassFish 应用服务器 |
V2 |
| Hibernate 插件 |
可以从 NetBeans Update Center 获得 |
| Travel 数据库 |
是 |
向 IDE 中添加 Hibernate 支持
要将对 Hibernate 的支持集成到 IDE 中,需要安装 Hibernate 插件,可以从 NetBeans Beta Update Center 获得这些插件。Beta 更新中心包含两个用于 Hibernate 的插件。
- 从主菜单中选择“工具”>“插件”。
- 在“可用插件”选项卡中,选择以下插件并单击“安装”。
- Hibernate 支持
- Hibernate 3.2.5 库
- 执行向导中的步骤安装插件。
安装 Hibernate 插件会向项目中添加创建 Hibernate 文件和添加 Hibernate 库的支持。
创建 Web 应用程序项目
在本练习中,您将创建一个 Visual Web JSF 项目并向该项目中添加 Hibernate 库。创建项目时,将在“新建项目”向导的“框架”面板中选择“Visual Web JSF”和“Hibernate”。还将指定数据库。
- 选择“文件”>“新建项目”(Ctrl-Shift-N)。从“Web”类别中选择“Web 应用程序”并单击“下一步”。
- 为项目名称键入 HibernateTravelApp 并设置项目位置。
- 如果“使用指定文件夹”选项为选中状态,则取消选中它。
(对于本教程,没有理由将项目库复制到指定文件夹,因为您将需要与其他用户共享库)。
单击“下一步”。
- 将服务器设置为 GlassFish 并将“Java EE 版本”设置为 Java EE 5。单击“下一步”。
- 选中“Visual Web JavaServer Faces”复选框。
- 选中“Hibernate 3.2.5”复选框。
- 使用默认会话名称 (session1) 并确保为“数据库连接”和“连接 URL”选择 Travel 数据库。单击“完成”。
注意:IDE 附带一个示例 Travel 数据库以及一个到该数据库的预配置的连接。如果在向导的“框架”面板中,Travel 数据库未作为一个可用选项,则检查“服务”窗口中的“数据库”节点下是否列出了该连接。如果此处没有该连接,则需要创建数据库连接。
单击“完成”后,IDE 便创建 Web 应用程序项目并在编辑器中打开 hibernate.cfg.xml 文件和 Page1。
如果展开“项目”窗口中的“库”节点,则可以看到 IDE 已向项目中添加了 Hibernate 库。
修改 Hibernate 配置文件
创建使用 Hibernate 框架的新项目时,IDE 自动在应用程序的上下文类路径的根路径(“文件”窗口中的 WEB-INF/classes)上创建 hibernate.cfg.xml 配置文件。该文件位于“项目”窗口的“配置文件”节点下。该配置文件包含有关数据库连接、资源映射和其他连接属性的信息。您可以使用多视图编辑器编辑该文件或直接在 XML 编辑器中编辑 XML。
在本练习中,您将编辑在 hibernate.cfg.xml 中指定的默认属性,以启用 SQL 语句的调试日志记录以及 Hibernate 的会话上下文管理。
- 打开“设计”选项卡中的 hibernate.cfg.xml(如果尚未打开)。可以通过展开“项目”窗口的“配置文件”节点并双击 hibernate.cfg.xml 来打开该文件。
- 在“可选属性”下,展开“配置属性”节点。
- 单击“添加”以打开“添加 Hibernate 属性”对话框。
- 在此对话框中,选择 hibernate.show_sql 属性并将值设置为 true。这将启用 SQL 语句的调试日志记录。
-
- 展开“其他属性”节点并单击“添加”。
- 在此对话框中,选择 properties hibernate.current_session_context_class 并将值设置为 thread 以启用 Hibernate 的自动会话上下文管理。
如果单击编辑器中的 XML 选项卡,则可以在 XML 视图中看到此文件。该文件应该如下所示:
<hibernate-configuration>
<session-factory name="session1">
<property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property>
<property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
<property name="hibernate.connection.url">jdbc:derby://localhost:1527/travel</property>
<property name="hibernate.connection.username">travel</property>
<property name="hibernate.connection.password">travel</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
- 保存对该文件所做的更改。
创建 Java 对象
在本教程中,使用两个 Plain Old Java Object (POJO) Person 和 Trip 来代表 Travel 数据库的表 PERSON 和 TRIP 中的数据。每个类为表中的列指定字段并使用简单的 setter 和 getter 检索和编写数据。创建类之后,需要将类映射到表。
创建 Person Java 类
- 右键单击“项目”窗口中的“源包”节点并选择“新建”>“Java 类”以打开“新建 Java 类”向导。
- 在该向导中,为类名键入 Person,为包键入 travel。单击“完成”。
- 对类进行以下更改(粗体)以实现“可序列化”接口并为表列添加字段。
public class Person implements Serializable {
private int personId;
private String name;
private String jobTitle;
private boolean frequentFlyer;
private java.util.Set trips;
}
- 通过右键单击“源编辑器”,选择“插入代码”(Alt-Insert),然后选择“Getter 和 Setter”为字段生成 getter 和 setter。
- 在“生成 Getter 和 Setter”对话框中,选择所有字段并单击“生成”。
在“生成 Getter 和 Setter”对话框中,可以使用键盘上的向上箭头将所选项移动到 Person 项,然后单击空格键选择 Person 中的所有字段。
- 修复导入并保存更改。
创建 Trip Java 类
- 右键单击“项目”窗口中的“源包”节点并选择“新建”>“Java 类”以打开“新建 Java 类”向导。
- 在该向导中,为类名键入 Trip,为包键入 travel。单击“完成”。
- 对类进行以下更改(粗体)以实现“可序列化”接口并为表列添加字段。
public class Trip implements Serializable {
private int tripId;
private int personId;
private Date depDate;
private String depCity;
private String destCity;
private int tripTypeId;
}
- 通过右键单击“源编辑器”,选择“插入代码”(Alt-Insert),然后选择“Getter 和 Setter”为字段生成 getter 和 setter。
- 在“生成 Getter 和 Setter”对话框中,选择所有字段并单击“生成”。
- 修复导入并保存更改。
可以关闭 Person.java 和 Trip.java,因为不再需要编辑这些文件。
将类映射到数据库表
已经拥有代表表的类之后,需要使用 Hibernate 映射文件将每个持久类映射到各个表。映射文件是一个包含 ORM 元数据的 XML 文件,ORM 元数据定义将类字段映射到表列和主键的方式。将为每个类创建一个 Hibernate 映射文件。
在此部分中,使用“新建文件”向导为每个类创建一个简单的 .hbm.xml Hibernate 映射文件。然后需要在 XML 编辑器中编辑该文件,以将每个类中的字段映射到相应表中的列并设置其他属性。可以使用 IDE 的代码完成来帮助您编辑映射文件。
将 Person.java 映射到 PERSON 表
首先,将创建 Hibernate 映射文件 Person.hbm.xml,以将 Person.java 中的字段映射到 PERSON 表中的列。
- 启动 JavaDB 数据库服务器(如果未启动)。
- 在“项目”窗口中,右键单击“源包”下的 Travel 节点,然后在弹出菜单中选择“新建”>“其他”以打开“新建文件”向导。
- 从“类别”列表中选择 Hibernate,从“文件类型”列表中选择“Hibernate 映射文件”。单击“下一步”。
- 为文件名键入 Person.hbm,将文件夹设置为 src/java/travel。单击“下一步”。
- 为“要映射的类”键入 travel.Person。
注意:或者,可以单击“浏览”按钮并在“查找类型”对话框中键入“Person”。
- 从“数据库表”下拉列表中选择 PERSON。
注意:如果“数据库表”下拉列表为空,则可能意味着数据库未运行。您可以继续执行操作并创建文件,而无需指定表,但您需要记住在 XML 中提供该表。
- 单击“完成”。
单击完成后,IDE 在与 Person.java 相同的源包中创建 Person.hbm.xml 文件并在编辑器中打开该文件。默认情况下,XML 文件如下所示:
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Person" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="PERSON"/>
</hibernate-mapping>
注意:如果创建文件时,无法在下拉列表中选择 PERSON 表,则确保将 table="PERSON" 添加到 class 元素中。
- 在 XML 编辑器中,进行以下更改(粗体)以映射 ID、属性以及一对多关系。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
<id column="PERSONID" name="personId">
<generator class="increment"/>
</id>
<property column="NAME" name="name"/>
<property column="JOBTITLE" name="jobTitle"/>
<property column="FREQUENTFLYER" name="frequentFlyer"/>
<set cascade="all-delete-orphan" inverse="true" lazy="true" name="trips" table="TRIP">
<key column="PERSONID"/>
<one-to-many class="travel.Trip"/>
</set>
</class>
</hibernate-mapping>
可以在 XML 编辑器中使用代码完成来帮助您添加属性和值。如果在此屏幕截图中代码完成没有为您工作,则会看到以下说明。
注意:默认情况下,class 元素具有一个结束标记。因为需要在打开和关闭 class 元素之间添加属性元素,所以需要进行以下更改(粗体)。进行更改之后,可以在 class 元素之间使用代码完成。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false"
mutable="true" name="travel.Person" optimistic-lock="version"
polymorphism="implicit" select-before-update="false" table="PERSON">
</class>
</hibernate-mapping>
- 验证 XML,修复任何验证错误并保存文件。
将 Trip.java 映射到 TRIP 表
现在,您将创建 Hibernate 映射文件 Trip.hbm.xml,以将 Trip.java 中的字段映射到 TRIP 表中的列。
- 在“项目”窗口中,右键单击“源包”下的 Travel 节点,然后在弹出菜单中选择“新建”>“其他”以打开“新建文件”向导。
- 从“类别”列表中选择 Hibernate,从“文件类型”列表中选择“Hibernate 映射文件”。单击“下一步”。
- 为文件名键入 Trip.hbm,将文件夹设置为 src/java/travel。单击“下一步”。
- 为“要映射的类”键入 travel.Trip。
注意:或者,可以单击“浏览”按钮并在“查找类型”对话框中键入“Trip”。
- 从“数据库表”下拉列表中选择 TRIP。
注意:如果“数据库表”下拉列表为空,则在此处将其保留为空。之后可以在 XML 编辑器中输入表名称。
- 单击“完成”。
单击完成后,IDE 在与类 Trip.java 相同的文件夹中创建 Trip.hbm.xml 并在编辑器中打开该文件。
- 在 XML 编辑器中,进行以下更改(粗体)。
<hibernate-mapping>
<class dynamic-insert="false" dynamic-update="false" mutable="true"
name="travel.Trip" optimistic-lock="version" polymorphism="implicit"
select-before-update="false" table="TRIP">
<id column="TRIPID" name="tripId">
<generator class="increment"/>
</id>
<property column="PERSONID" name="personId"/>
<property column="DEPDATE" name="depDate" type="date"/>
<property column="DEPCITY" name="depCity"/>
<property column="DESTCITY" name="destCity"/>
<property column="TRIPTYPEID" name="tripTypeId"/>
</class>
</hibernate-mapping>
在 XML 编辑器中使用代码完成来帮助您添加属性和值。
- 验证 XML,修复任何验证错误并保存文件。
创建 Hibernate Helper 类
要使用 Hibernate,您需要创建一个 helper 类,该类处理启动并访问 Hibernate 的 SessionFactory 来获得 Session 对象,以便您可以加载和存储 Person 和 Trip 对象。此 helper 类首先调用 Configuration() 来加载 hibernate.properties 文件。然后该类调用 configure() 并加载 hibernate.cfg.xml 配置文件。最后,此 helper 类构建 SessionFactory 来获得 Session 对象。
在此部分中,使用“新建文件”向导创建 helper 类 HibernateUtil.java。
- 右键单击 travel 源包节点并选择“新建”>“其他”以打开“新建文件”向导。
- 从“类别”列表中选择 Hibernate,从“文件类型”列表中选择 HibernateUtil.java。单击“下一步”。
- 为类名键入 HibernateUtil。单击“完成”。
单击“完成”后,该类在编辑器中打开。由于不需要编辑该文件,因此可以关闭该文件。
现在,您就拥有了用于应用程序的所有类。如果在“项目”窗口中展开“源包”节点,您的项目应该类似于以下屏幕截图。
创建 Visual Web JSF 页
创建类之后,可以创建用于显示和修改数据的 Web 页。将创建一个使用 JSF 框架和绑定到对象的 Visual Web JSF 组件的 JSP 页。
向页中添加 Visual Web JSF 组件
- 在“项目”窗口中,展开“Web 页”文件夹并在“可视设计器”中打开 Page1.jsp。
- 将“下拉列表”组件从调色板中的 Woodstock 基本组件集拖放到 Page1 的左上角。
- 右键单击“下拉列表”组件,并从弹出菜单中选择“更改时自动提交”。
只要用户从下拉列表中选择一个新值,该操作就会使浏览器提交该页面。
- 再次右键单击“下拉列表”组件并选择“添加绑定属性”。
注意:您将在本教程的后面部分指定属性绑定。NetBeans IDE 6.1 具有按需绑定功能。在组件需要 Java 编码的位置,必须手动向 Visual Web JSF 应用程序中的组件添加绑定属性。要执行此操作,请右键单击每个组件并选择“添加绑定属性”。有关详细信息,请参阅 按需绑定属性 Wiki。
- 将一个“表”组件拖放到“下拉列表”组件下。
- 将一个“消息组”组件拖放到“表”组件下。
“消息组”组件帮助您诊断运行时问题。默认情况下,“消息组”组件显示有关运行时错误、验证错误和转换错误的消息。
- 保存更改。
现在,您的 Web 页已具备了必要的组件。现在,需要将这些组件绑定到数据源。
从 SessionBean1 访问数据源
现在,您需要编辑 SessionBean1 以访问数据源。在本练习中,使用“添加属性”对话框指定 SessionBean1 中的字段并为这些字段生成 getter 和 setter。会话 Bean 打开一个会话上下文,然后通过 Java 对象检索数据。
- 在“项目”窗口中,展开 hibernatetravelapp 源包并双击 SessionBean1.java 以在编辑器中打开该文件。
- 将光标放置在源代码中的空白区域(例如,构造函数后面),右键单击并选择“插入代码”>“添加属性”(Ctrl-I) 以打开“添加属性”对话框。
- 在“添加属性”对话框中,为“名称”键入 personOptions,为“类型”键入 Option[] 并选择 private。
- 选择“生成 Getter 和 Setter”(如果未选择)。单击“确定”。
- 重复这些步骤添加以下属性:
| selectedPersonId |
整数 |
| trips4Person |
Trip[] |
- 通过在 getApplicationBean1 方法之后向 SessionBean1 中添加以下内容(粗体)向类中添加方法 buildPersonOptions 和 updateTrips4Person。
protected ApplicationBean1 getApplicationBean1() {
return (ApplicationBean1) getBean("ApplicationBean1");
}
private void buildPersonOptions() {
List<Person> personList = null;
try{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Person");
personList = (List<Person>) q.list();
} catch(Exception e) {
e.printStackTrace();
}
personOptions = new Option[personList.size()];
int i=0;
for(Person person :personList) {
Option opt = new Option(person.getPersonId(), person.getName());
personOptions[i++] = opt;
}
}
private void updateTrips4Person() {
if(selectedPersonId == null ) {
trips4Person = new Trip[1];
trips4Person[0] = new Trip();
return;
}
Set personTrips = null;
try{
Session session =
HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = session.beginTransaction();
Person person = (Person)session.load(Person.class, selectedPersonId);
personTrips = (PersistentSet)person.getTrips();
} catch(Exception e) {
e.printStackTrace();
}
trips4Person = (Trip[]) personTrips.toArray(new Trip[0]);
}
buildPersonOptions 方法调用在 Person 数据源上的一个查询并将结果存储在 personOptions 数组中。updateTrips4Person 方法更新所选个人的行程。
- 修复导入。
注意:选择要导入的完全限定名称时,确保选择 org.hibernate 库以及 com.sun.Webui.jsf.model.Option 和 java.util.Set。
- 通过在 init() 方法的结尾添加以下内容(粗体)来调用方法 buildPersonOptions。
@Override
public void init() {
super.init();
try {
_init();
} catch (Exception e) {
log("SessionBean1 Initialization Failure", e);
throw e instanceof FacesException ?(FacesException) e :new FacesException(e);
}
// Fill in the personOptions[]
buildPersonOptions();
}
- 通过在 setSelectedPersonId 方法的结尾添加以下内容(粗体)来调用方法 updateTrips4Person。
public void setSelectedPersonId(Integer selectedPersonId) {
this.selectedPersonId = selectedPersonId;
updateTrips4Person();
}
- 保存更改。
- 在“项目”窗口中右键单击项目节点,并选择“构建”。
将组件绑定到数据
在此部分中,将 Web 页中的“下拉列表”和“表”组件绑定到 SessionBean1 中在上一部分定义的属性。
- 在“可视设计器”中打开 Page1.jsp。
- 右键单击“下拉列表”组件并选择“属性绑定”以打开“属性绑定”对话窗口。
- 在可绑定的属性列表中选择“项目”并在绑定目标列表中选择 personOptions(位于 SessionBean1 节点下)。单击“应用”。
- 在该对话框中,在可绑定的属性列表中选择“选定”并在绑定目标列表中选择 selectedPersonId(位于 SessionBean1 节点下)。单击“应用”。
- 单击“关闭”关闭此对话窗口。
- 在可视设计器中,右键单击“表”组件并选择“表布局”。
- 在该对话框中,从“从中获取数据”下拉列表中选择 trips4Person (SessionBean1)。
注意:如果在下拉列表中没有看到 trips4Person (SessionBean1),则很可能是因为您忘记了在上一部分结束时构建该项目。
- 在“选定”列表中选择 personId 并单击向左箭头按钮将该字段从“选定”列表移动到“可用”列表中。
- 使用“上移”和“下移”按钮按以下顺序排列剩余的字段,如下所示,然后单击“确定”。
- 在“编辑”工具栏中,单击 Java 以在 Java 编辑器中打开 Page1.java。
- 在 prerender 方法中,添加以下代码(粗体)。
public void prerender() {
try {
if (dropDown1.getSelected() == null ) {
Option firstPerson = getSessionBean1().getPersonOptions()[0];
getSessionBean1().setSelectedPersonId((Integer)firstPerson.getValue());
}
} catch (Exception ex) {
log("Error Description", ex);
error(ex.getMessage());
}
}
prerender 方法中的代码将在 Web 浏览器开始显示页面之前调用。向 prerender 方法中添加代码会使该页在用户第一次访问页面时在下拉列表中显示第一个人的信息。
当浏览器首次请求此页面时,应用程序会创建 Page1 的一个实例并调用 prerender 方法。服务器将发送响应(HTML 页面),并且 Page1 实例将被破坏。应用程序并不会调用值更改事件处理程序,因为应用程序只有在提交页面时(在本例中,选择一个新的个人时)才会生成值更改事件。
- 右键单击源代码并从弹出菜单中选择“修复导入”以打开“修复导入”对话框。在“全限定名称”下拉列表中,选择 com.sun.Webui.jsf.model.Option,如下所示。
- 保存更改。
运行项目
在主工具栏中单击“运行主项目”。
IDE 将保存所有修改的文件,重新构建应用程序并将其部署到服务器中。
- 从下拉列表中选择某个人,查看表的内容如何随所选个人的数据一起更新。
更多信息