blob: 20c13d64c907cb7aaeb9e4e4c5a2f559344bc81d [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
Copyright (c) 2009, 2010, 2011, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<title>Using Hibernate in a Web Application - NetBeans IDE Tutorial</title>
<!-- BEGIN METADATA -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta name="description" content="Demonstrates how to add support for Hibernate to the IDE and use Hibernate with JSF components in a Web application.">
<meta name="KEYWORDS" content="NetBeans, Hibernate, JSF, Tutorial, Database">
<link rel="stylesheet" href="../../../netbeans.css" type="text/css">
<!-- END METADATA -->
</head>
<body>
<a name="top"></a>
<h1>Using Hibernate in a Web Application</h1>
<!-- Currently this tutorial does not work -- #243018 -->
<p>In this tutorial, you use the NetBeans IDE to create and deploy a web application that displays
data from a database. The web application uses the Hibernate framework as the persistence layer for
retrieving and storing plain old Java objects (POJOs) to a relational database.</p>
<p>Hibernate is framework that provides tools for object relational mapping (ORM).
The tutorial demonstrates how to add support for the Hibernate framework to the IDE and
create the necessary Hibernate files.
After creating the Java objects and configuring the application to use Hibernate,
you create a JSF managed bean and JSF 2.0 pages to display the data.</p>
<p>Before starting this tutorial you may want to familiarize yourself with
the following documents.</p>
<ul>
<li>Hibernate documentation at <a href="http://www.hibernate.org/" target="_blank">hibernate.org</a></li>
<li><a href="quickstart-webapps.html">Introduction to Developing Web Applications</a></li>
<li><a href="jsf20-intro.html">Introduction to JavaServer Faces 2.x</a></li>
</ul>
<p><b>Contents</b></p>
<img src="../../../images_www/articles/72/netbeans-stamp-74-73-72.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.2, 7.3 and 7.4" title="Content on this page applies to the NetBeans IDE 7.2, 7.3 and 7.4" >
<ul>
<li><a href="#01">Creating the Database</a></li>
<li><a href="#02">Creating the Web Application Project</a></li>
<li><a href="#03">Modifying the Hibernate Configuration File</a></li>
<li><a href="#04">Creating the <tt>HibernateUtil.java</tt> Helper File</a></li>
<li><a href="#05">Generating Hibernate Mapping Files and Java Classes</a></li>
<li><a href="#06">Creating the <tt>FilmHelper.java</tt> Helper Class</a></li>
<li><a href="#07">Creating the JSF Managed Bean</a>
<li><a href="#08">Creating the Web Pages</a></li>
<li><a href="#09">Running the Project</a></li>
<li><a href="#10">Downloading the Solution Project</a></li>
<li><a href="#11">Troubleshooting</a></li>
</ul>
<p><b>To follow this tutorial, you need the following software and resources.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">7.1, 7.2, 7.3, 7.4, Java EE version</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">Version 6 or 7</td>
</tr>
<tr>
<td class="tbltd1">GlassFish Server Open Source Edition</td>
<td class="tbltd1">3.x or 4.x</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.mysql.com/">MySQL database server</a></td>
<td class="tbltd1">Version 5.x</td>
</tr>
<tr>
<td class="tbltd1">Sakila Database</td>
<td class="tbltd1">Plugin available from update center</td>
</tr>
</tbody>
</table>
<p class="tips">You can download <a href="https://netbeans.org/projects/samples/downloads/download/Samples/JavaEE/DVDStoreEE6.zip">a zip archive of the finished project</a>.</p>
<a name="01"></a>
<h2>Creating the Database</h2>
<p>This tutorial uses a MySQL database called <tt>sakila</tt>,
a free sample MySQL database that is available from the MySQL site.
The sakila database is not included when you install the IDE so you need to
first create the database to follow this tutorial.</p>
<p>To create the sakila database you can download and install the Sakila Sample Database plugin
using the Plugins manager.
After you install the plugin the sakila database is added to the list of databases
in the Create MySQL database dialog box.</p>
<p>For more information on configuring the IDE to work with MySQL, see the
<a href="../ide/mysql.html">Connecting to a MySQL Database</a> tutorial.</p>
<ol>
<li>Open the Plugins manager and install the Sakila Sample Database plugin.</li>
<li>After installing the plugin, start the MySQL database by expanding the Databases node in the Services window,
right-clicking the MySQL Server node and choosing Start.</li>
<li>Right-click the MySQL Server node and choose Create Database.</li>
<li>Select the Sakila database from the New Database Name drop down list in the Create MySQL Database dialog box. Click OK.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/create-sakila-mysql.png" width="393" height="176" alt="Screenshot of Create MySQL Database dialog" title="Screenshot of Create MySQL Database dialog" class="margin-around b-all">
<p>When you click OK a Sakila node appears under the MySQL Server node.</p>
<li>Right-click the Sakila node and choose Connect.</li>
</ol>
<p>When you click Connect a database connection node for the Sakila database
(<tt>jdbc:mysql://localhost:3306/sakila [<i>username</i> on Default]</tt>)
is listed under the Databases node.
When a connection is open you can view the data in the database by expanding the connection node.</p>
<a name="02"></a>
<h2>Creating the Web Application Project</h2>
<p>In this exercise you will create a web application project and add the Hibernate libraries to the project.
When you create the project, you will select Hibernate in the Frameworks panel of the New Project wizard
and specify the database.</p>
<ol>
<li>Choose File &gt; New Project (Ctrl-Shift-N; &#8984-Shift-N on Mac) from the main menu.
Select Web Application from the Java Web category and click Next. </li>
<li>Type <strong>DVDStore</strong> for the project name and set the project location.</li>
<li>Deselect the Use Dedicated Folder option, if selected. Click Next.
<p>For this tutorial there is little reason to copy project libraries to a dedicated folder because
you will not need to share libraries with other users.</p>
</li>
<li>Set the server to the GlassFish Server and set the Java EE Version to Java EE 6 Web or Java EE 7 Web. Click Next.</li>
<li>Select the JavaServer Faces checkbox and use the default JSF 2.x libraries.</li>
<li>Select the Hibernate checkbox in the list of frameworks.</li>
<li>Select the sakila database from the Database Connection drop down list. Click Finish.</li>
</ol>
<p class="notes"> <b>Note:</b>
If the sakila database is not available as an option in the Frameworks panel in the wizard,
check to see if the connection is listed under the Databases node in the Services window.
If the connection is not there, you need to create the database connection.</p>
<img src="../../../images_www/articles/74/web/hibernate-webapp/hib-newwebapp.png" alt="Frameworks panel of New Project wizard" title="Frameworks panel of New Project wizard showing adding Hibernate support to project" class="margin-around b-all">
<p>When you click Finish, the IDE creates the web application project and opens the <tt>hibernate.cfg.xml</tt> file
and <tt>index.xhtml</tt> in the editor.</p>
<p>If you expand the Libraries node in the Projects window, you can see that the IDE added the Hibernate libraries to the project.</p>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-libraries.png" alt="Screenshot of Projects window showing Hibernate libraries" title="Screenshot of Projects window showing Hibernate libraries" class="margin-around b-all">
<a name="03"></a>
<h2>Modifying the Hibernate Configuration File</h2>
<p>When you create a new project that uses the Hibernate framework, the IDE automatically creates the <tt>hibernate.cfg.xml</tt>
configuration file at the root of the context classpath of the application (in the Files window, <tt>src/java</tt>).
The file is located in the <tt>&lt;default package&gt;</tt> under the Source Packages node in the Projects window.
The configuration file contains information about the database connection, resource mappings, and other connection properties.
You can edit the file using the multi-view editor, or edit the XML directly in the XML editor.</p>
<p>In this exercise you will edit the default properties specified in <tt>hibernate.cfg.xml</tt> to enable debug logging for SQL statements
and to enable Hibernate's session context management.</p>
<ol>
<li>Open <tt>hibernate.cfg.xml</tt> in the Design tab.
You can open the file by expanding the <tt>&lt;default package&gt;</tt> node under Source Packages in the Projects window and double-clicking <tt>hibernate.cfg.xml</tt>.</li>
<li>In the multi-view XML editor, expand the Configuration Properties node under Optional Properties.</li>
<li>Click Add to open the Add Hibernate Property dialog box.</li>
<li>In the dialog box, select the <tt>hibernate.show_sql</tt> property and set the value to <tt>true</tt>.
This enables the debug logging of the SQL statements.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/add-property-showsql.png" alt="Add Hibernate Property dialog box the hibernate.show_sql property" title="Add Hibernate Property dialog box showing setting value for the hibernate.show_sql property" class="margin-around b-all">
</li>
<li>Expand the Miscellaneous Properties node and click Add.</li>
<li>In the dialog box, select the <tt>properties hibernate.current_session_context_class</tt> and set the value to <tt>thread</tt>
to enable Hibernate's automatic session context management.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/add-property-sessioncontext.png" alt="Add Hibernate Property dialog box for properties hibernate.current_session_context_class" title="Add Hibernate Property dialog box showing setting value for the hibernate.current_session_context_class property" class="margin-around b-all"></li>
<li>Click Add again under the Miscellaneous Properties node and select <tt>hibernate.query.factory_class</tt> in the Property Name dropdown list.</li>
<li>Select <strong>org.hibernate.hql.classic.ClassicQueryTranslatorFactory</strong> as the Property Value. Click OK.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/add-property-factoryclass.png" alt="Add Hibernate Property dialog box for properties hibernate.query.factory_class" title="Add Hibernate Property dialog box showing setting value for the hibernate.query.factory_class property" class="margin-around b-all">
<p>If you click the XML tab in the editor you can see the file in XML view. Your file should look similar to the following (the three new properties are bold):</p>
<pre class="examplecode">&lt;hibernate-configuration&gt;
&lt;session-factory name="session1"&gt;
&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
&lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt;
&lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/sakila&lt;/property&gt;
&lt;property name="hibernate.connection.username"&gt;root&lt;/property&gt;
&lt;property name="hibernate.connection.password"&gt;######&lt;/property&gt;
<strong>&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
&lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;
&lt;property name="hibernate.query.factory_class"&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactory&lt;/property&gt;</strong>
&lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;</pre>
</li>
<li>Save your changes to the file.</li>
</ol>
<p>You can close the file because you do not need to edit the file again.</p>
<a name="04"></a>
<h2>Creating the <tt>HibernateUtil.java</tt> Helper File</h2>
<p>To use Hibernate you need to create a helper class that handles startup
and that accesses Hibernate's <tt>SessionFactory</tt> to obtain a Session object.
The class calls <tt>configure()</tt> and loads the <tt>hibernate.cfg.xml</tt> configuration file
and then builds the <tt>SessionFactory</tt> to obtain the Session object.
</p>
<p>In this section you use the New File wizard to create the helper class <tt>HibernateUtil.java</tt>.</p>
<ol>
<li>Right-click the Source Packages node and select New &gt; Other to open the New File wizard.</li>
<li>Select Hibernate from the Categories list and HibernateUtil.java from the File Types list. Click Next.</li>
<li>Type <strong>HibernateUtil</strong> for the class name and <strong>dvdrental</strong> for the package. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hibernate-util-wizard.png" width="600" alt="Screenshot of HibernateUtil wizard" title="Screenshot of HibernateUtil wizard" class="margin-around b-all">
<p>When you click Finish, <tt>HibernateUtil.java</tt> opens in the editor.
You can close the file because you do not need to edit the file.</p>
<a name="05"></a>
<h2>Generating Hibernate Mapping Files and Java Classes</h2>
<p>In this tutorial you use a POJO (plain old Java object)
to represent the data in each of the tables in the database that you will use.
The Java class specifies the fields for the columns in the tables and uses simple setters and getters to retrieve and
write the data.
To map the POJOs to the tables you can use a Hibernate mapping file or use annotations in the class.</p>
<p>You can use the Hibernate Mapping Files and POJOs from a Database wizard to create multiple POJOs and mapping files based on database tables.
When you use the wizard you select all the tables for which you want
POJOs and mapping files and the IDE then generates the files for you based on the database tables and adds the mapping entries to <tt>hibernate.cfg.xml</tt>.
When you use the wizard you can choose the files that you want the IDE to generate (only the POJOs, for example)
and select code generation options (generate code that uses EJB 3 annotations, for example).</p>
<p class="notes"><strong>Note.</strong> The IDE also has wizards to help you create individual POJOs and mapping files
from scratch.</p>
<div class="indent">
<a name="05a"></a>
<h3>Creating the Hibernate Reverse Engineering File</h3>
<p>If you want to use the Hibernate Mapping Files and POJOs from a Database wizard, you first need to create
a <tt>hibernate.reveng.xml</tt> reverse engineering file.
The Hibernate Mapping Files and POJOs from a Database wizard requires <tt>hibernate.reveng.xml</tt> and <tt>hibernate.cfg.xml</tt>.</p>
<p>The reverse engineering file enables you to have greater control over the database mapping strategy.
The Hibernate Reverse Engineering Wizard creates a reverse engineering file with a default
configuration that you can edit in the XML editor.</p>
<p>To create the Hibernate reverse engineering file, perform the following steps.</p>
<ol>
<li>Right-click the Source Packages node in the Projects window and choose New &gt; Other to open the New File wizard.</li>
<li>Select Hibernate Reverse Engineering Wizard in the Hibernate category. Click Next.</li>
<li>Specify <tt>hibernate.reveng</tt> as the File Name and <tt>src/java</tt> for the Folder. Click Next.</li>
<li>Select <tt>hibernate.cfg.xml</tt> from the Configuration File drop down list, if not selected.</li>
<li>Select the following tables from Available Tables and click Add to add the tables to Selected Tables.
<ul>
<li>actor</li>
<li>category</li>
<li>film</li>
<li>film_actor</li>
<li>film_category</li>
<li>language</li>
</ul>
<p>Click Finish.</p>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hibernate-reveng-wizard.png" width="600" alt="New Hibernate Reverse Engineering wizard" title="New Hibernate Reverse Engineering wizard" class="margin-around b-all">
</li>
</ol>
<p>The wizard generates a <tt>hibernate.reveng.xml</tt> reverse engineering file and opens the file in the editor.
You can close the reverse engineering file because you will not need to edit the file.</p>
<p class="tips">For more details about working with the <tt>hibernate.reveng.xml</tt> file, see
<a href="http://docs.jboss.org/tools/2.1.0.Beta1/hibernatetools/html/reverseengineering.html" target="_blank">Chapter 5. Controlling reverse engineering</a>
in the <a href="http://docs.jboss.org/tools/2.1.0.Beta1/hibernatetools/html/" target="_blank">Hibernate Tools Reference Guide</a>.</p>
<h3>Creating the Hibernate Mapping Files and POJOs</h3>
<p>You can use the Hibernate Mapping Files and POJOs from a Database wizard to generate files for you.
The wizard can generate a POJO and a corresponding mapping file for each table that you select in the wizard.
The mapping files are XML files that contain data about how the columns in the tables are mapped to the fields in the POJOs.
You need to have the <tt>hibernate.reveng.xml</tt> and <tt>hibernate.cfg.xml</tt> files to use the wizard.</p>
<p>To create the POJOS and mapping files using a wizard, perform the following steps.</p>
<ol>
<li>Right-click the Source Packages node in the Projects window and choose New &gt; Other to open the New File wizard.</li>
<li>Select Hibernate Mapping Files and POJOs from a Database in the Hibernate category. Click Next.</li>
<li>Ensure that the <tt>hibernate.cfg.xml</tt> and <tt>hibernate.reveng.xml</tt>
files are selected in the drop down lists.</li>
<li>Select <strong>JDK 5 Language Features</strong> under the General Settings options.</li>
<li>Ensure that the <strong>Domain Code</strong> and <strong>Hibernate XML Mappings</strong> options are selected.</li>
<li>Select <strong>dvdrental</strong> for the Package name. Click Finish.<br />
<img src="../../../images_www/articles/72/web/hibernate-webapp/hibernate-pojo-wizard2.png" width="600" alt="Generate Hibernate Mapping Files and POJOs wizard" title="Generate Hibernate Mapping Files and POJOs wizard" class="margin-around b-all">
</li>
</ol>
<p>When you click Finish the IDE generates POJOs and Hibernate mapping files with the fields mapped to the columns
specified in <tt>hibernate.reveng.xml</tt>.
The IDE also adds mapping entries to <tt>hibernate.cfg.xml</tt>.</p>
<pre class="examplecode">&lt;hibernate-configuration&gt;
&lt;session-factory&gt;
&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt;
&lt;property name="hibernate.connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt;
&lt;property name="hibernate.connection.url"&gt;jdbc:mysql://localhost:3306/sakila&lt;/property&gt;
&lt;property name="hibernate.connection.username"&gt;myusername&lt;/property&gt;
&lt;property name="hibernate.connection.password"&gt;mypassword&lt;/property&gt;
&lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
&lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;
&lt;property name="hibernate.query.factory_class"&gt;org.hibernate.hql.classic.ClassicQueryTranslatorFactory&lt;/property&gt;
&lt;mapping resource="dvdrental/FilmActor.hbm.xml"/&gt;
&lt;mapping resource="dvdrental/Language.hbm.xml"/&gt;
&lt;mapping resource="dvdrental/Film.hbm.xml"/&gt;
&lt;mapping resource="dvdrental/Category.hbm.xml"/&gt;
&lt;mapping resource="dvdrental/Actor.hbm.xml"/&gt;
&lt;mapping resource="dvdrental/FilmCategory.hbm.xml"/&gt;
&lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;</pre>
<p class="notes"><strong>Note.</strong> Confirm that the <tt>mapping</tt> elements are listed after
the <tt>property</tt> elements in the <tt>hibernate.cfg.xml</tt> file.</p>
<p>You can expand the <tt>dvdrental</tt> package to see the files generated by the wizard.</p>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-projectswindow.png" alt="Screenshot of Projects window showing generated POJOs" title="Projects window showing generated POJOs" class="margin-around b-all">
<p class="tips">You can use the Hibernate Mapping wizard if you want to create a Hibernate mapping file that maps a specific table
to a specific class.</p>
<p class="tips">For more details about working with the <tt>hibernate.reveng.xml</tt> file, see
<a href="http://docs.jboss.org/hibernate/core/3.3/reference/en/html/mapping.html" target="_blank">Chapter 5. Basic O/R Mapping</a>
in the <a href="http://docs.jboss.org/hibernate/stable/core/reference/en/html/" target="_blank">Hibernate Reference Documentation</a>.</p>
</div>
<a name="06"></a>
<h2>Creating the <tt>FilmHelper.java</tt> Helper Class</h2>
<p>You will now create a helper class in the <tt>dvdrental</tt> package that will be used to perform Hibernate queries on the database.
You will use the Hibernate Query Language (HQL) editor to construct and test the queries for retrieving data.
After you test the queries you will create methods in the helper class that construct and run the queries.
You will then invoke the methods in the helper class from a JSF managed bean.</p>
<a name="06a"></a>
<div class="indent">
<h3>Creating the Class</h3>
<p>In this section you use the New File wizard to create the helper class <tt>FilmHelper.java</tt> in the <tt>dvdrental</tt> package.
You will create a Hibernate session by calling <tt>getSessionFactory</tt> in <tt>HibernateUtil.java</tt> and create
some helper methods to create queries to retrieve data from the database.
You will invoke the helper methods from the JSP pages.</p>
<ol>
<li>Right-click the <tt>dvdrental</tt> source package node and select New &gt; Java Class to open the New File wizard.</li>
<li>Type <strong>FilmHelper</strong> for the class name. </li>
<li>Confirm that <strong>dvdrental</strong> is selected as the Package. Click Finish.</li>
<li>Adding the following code (in bold) to create a Hibernate session.
<pre class="examplecode">public class FilmHelper {
<strong>Session session = null;
public FilmHelper() {
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}</strong>
}</pre>
</li>
<li>Right-click in the editor and choose Fix Imports (Alt-Shift-I; &#8984-Shift-I on Mac) to add any required import statements (<tt>org.hibernate.Session</tt>) and save your changes.</li>
</ol>
<p>You will now modify <tt>FilmHelper.java</tt> to add methods that query the DB.</p>
<a name="06b"></a>
<h3>Enumerating Film Titles and Retrieving Actors Using an HQL Query</h3>
<p>In this exercise you will create a Hibernate Query Language (HQL) query that queries the
database to retrieve a list of film titles from the Film table.
You will then add a method that queries both the Actor and Film_actor tables
to fetch the actors involved in a particular film.</p>
<p>The Film table has 1000 records so the method to retrieve the list of films should be able to
retrieve records based on the <tt>filmId</tt> primary key.
You will use the HQL editor to construct and test the HQL query.
After you have created the correct query you will add a method to the class that can generate the proper query.
</p>
<ol>
<li>Right-click the project node in the Projects window and choose Clean and Build.</li>
<li>Right-click <tt>hibernate.cfg.xml</tt> in the Projects window and choose Run HQL Query to open the HQL query editor.</li>
<li>Select hibernate.cfg from the drop down list in the toolbar.</li>
<li>Test the connection by typing the following in the editor and clicking the Run HQL Query button (&nbsp;<img src="../../../images_www/articles/72/web/hibernate-webapp/run_hql_query_16.png" width="16" height="16" alt="Run HQL Query button" title="Run HQL Query button" />&nbsp;) in the toolbar.
<pre class="examplecode">from Film</pre>
<p>When you click Run HQL Query you can see the results of the query in the bottom window of the HQL query editor.</p>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hibernate-hqleditor1.png" alt="Generate Hibernate Mapping Files and POJOs wizard" title="Generate Hibernate Mapping Files and POJOs wizard" class="margin-around b-all">
<p>If you click the SQL button you can see the equivalent SQL query.</p>
<pre class="examplecode">select film0_.film_id as col_0_0_ from sakila.film film0_</pre>
</li>
<li>Type the following query to retrieve the records in the Film table where the film id is between 100 and 200.
<pre class="examplecode">from Film as film where film.filmId between 100 and 200</pre>
<p>The result window displays a list of records.
Now that you have tested that the query returns the desired results, you can use the query in the helper class.</p>
</li>
<li>Add the following method <tt>getFilmTitles</tt> to <tt>FilmHelper.java</tt> to retrieve the films where the film id is between a certain range
specified by the variables <tt>startID</tt> and <tt>endID</tt>.
<pre class="examplecode">public List getFilmTitles(int startID, int endID) {
List&lt;Film&gt; filmList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Film as film where film.filmId between '"+startID+"' and '"+endID+"'");
filmList = (List&lt;Film&gt;) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return filmList;
}</pre>
</li>
<li>Add the following method <tt>getActorsByID</tt> that retrieves the actors in a particular
film. The method constructs the query using <tt>filmId</tt> as the input variable.
<pre class="examplecode">public List getActorsByID(int filmId){
List&lt;Actor&gt; actorList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery ("from Actor as actor where actor.actorId in (select filmActor.actor.actorId from FilmActor as filmActor where filmActor.film.filmId='" + filmId + "')");
actorList = (List&lt;Actor&gt;) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return actorList;
}</pre>
</li>
<li>Fix your imports and save your changes.
<p>When you fix your imports you want to choose <tt>java.util.List</tt> and <tt>org.hibernate.Query</tt>.</p>
</li>
</ol>
<a name="06d"></a>
<h3>Adding Additional Helper Methods</h3>
<p>You will now add additional helper methods that create queries based on an input variable.
You can check the queries in the HQL query editor.</p>
<ol>
<li>Add the following method to retrieve a list of categories according to <tt>filmId</tt>.
<pre class="examplecode">public Category getCategoryByID(int filmId){
List&lt;Category&gt; categoryList = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Category as category where category.categoryId in (select filmCat.category.categoryId from FilmCategory as filmCat where filmCat.film.filmId='" + filmId + "')");
categoryList = (List&lt;Category&gt;) q.list();
} catch (Exception e) {
e.printStackTrace();
}
return categoryList.get(0);
}</pre>
</li>
<li>Add the following method to retrieve a single film according to <tt>filmId</tt>.
<pre class="examplecode">public Film getFilmByID(int filmId){
Film film = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Film as film where film.filmId=" + filmId);
film = (Film) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return film;
}</pre>
</li>
<li>Add the following method to retrieve the film language according to <tt>langId</tt>.
<pre class="examplecode">public String getLangByID(int langId){
Language language = null;
try {
org.hibernate.Transaction tx = session.beginTransaction();
Query q = session.createQuery("from Language as lang where lang.languageId=" + langId);
language = (Language) q.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
}
return language.getName();
}</pre>
</li>
<li>Save your changes.</li>
</ol>
</div>
<a name="07"></a>
<h2>Creating the JSF Managed Bean</h2>
<p>In this exercise you will create a JSF managed bean.
The methods in the managed bean are used for displaying data in the JSF pages
and for accessing methods in the helper class to retrieve records.
The JSF 2.0 specification enables you to use annotations in a bean class
to identify the class as a JSF managed bean, to specify the scope and
to specify a name for the bean.</p>
<p>To create the managed bean, perform the following steps.</p>
<ol>
<li>Right-click the <tt>dvdrental</tt> source package node and choose New &gt; Other.</li>
<li>Select JSF Managed Bean from the JavaServer Faces category. Click Next.</li>
<li>Type <strong>FilmController</strong> for the Class Name.
<p>You will use the Managed Bean name <tt>filmController</tt> as the value for the <tt>inputText</tt> and
<tt>commandButton</tt> in the JSF page <tt>index.xhtml</tt> when calling methods in the bean.</p>
</li>
<li>Select <strong>dvdrental</strong> for the Package.</li>
<li>Type <strong>filmController</strong> for the Name that will be used for the managed bean.</li>
<li>Set Scope to Session. Click Finish.</li>
</ol>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-newmanagedbean.png" alt="New JSF Managed Bean wizard" title="New JSF Managed Bean wizard" class="margin-around b-all">
<p>When you click Finish, the IDE creates the bean class and opens the class in the editor.
The IDE added the <tt>@ManagedBean</tt> and <tt>@SessionScoped</tt> annotations.</p>
<pre class="examplecode">
@ManagedBean
@SessionScoped
public class FilmController {
/** Creates a new instance of FilmController */
public FilmController() {
}
}
</pre>
<p class="notes"><strong>Note.</strong> Note that the name of the managed bean is not explicitly specified.
By default, the name of the bean is the same as the class name and begins with a lower-case letter.
If you want the name of the bean to be different from the class name, you
can explicitly specify the name as a parameter of the <tt>@ManagedBean</tt> annotations
(for example, <tt>@ManagedBean(name="myBeanName")</tt>.</p>
<ol>
<li>Add the following fields (in bold) to the class.
<pre class="examplecode">
@ManagedBean
@SessionScoped
public class FilmController {
<strong>int startId;
int endId;
DataModel filmTitles;
FilmHelper helper;
private int recordCount = 1000;
private int pageSize = 10;
private Film current;
private int selectedItemIndex;</strong>
}</pre>
</li>
<li>Add the following code (in bold) to create the FilmController instance and retrieve the films.
<pre class="examplecode">
/** Creates a new instance of FilmController */
public FilmController() {
<strong>helper = new FilmHelper();
startId = 1;
endId = 10;
}
public FilmController(int startId, int endId) {
helper = new FilmHelper();
this.startId = startId;
this.endId = endId;
}
public Film getSelected() {
if (current == null) {
current = new Film();
selectedItemIndex = -1;
}
return current;
}
public DataModel getFilmTitles() {
if (filmTitles == null) {
filmTitles = new ListDataModel(helper.getFilmTitles(startId, endId));
}
return filmTitles;
}
void recreateModel() {
filmTitles = null;
}</strong></pre>
</li>
<li>Add the following methods that are used to display the table and navigate the pages.
<pre class="examplecode"><strong> public boolean isHasNextPage() {
if (endId + pageSize <= recordCount) {
return true;
}
return false;
}
public boolean isHasPreviousPage() {
if (startId-pageSize > 0) {
return true;
}
return false;
}
public String next() {
startId = endId+1;
endId = endId + pageSize;
recreateModel();
return "index";
}
public String previous() {
startId = startId - pageSize;
endId = endId - pageSize;
recreateModel();
return "index";
}
public int getPageSize() {
return pageSize;
}
public String prepareView(){
current = (Film) getFilmTitles().getRowData();
return "browse";
}
public String prepareList(){
recreateModel();
return "index";
}
</strong></pre>
<p>The methods that return "index" or "browse" will prompt the
JSF navigation handler to try to open a page named <tt>index.xhtml</tt> or <tt>browse.xhtml</tt>.
The JSF 2.0 specification enables the use of implicit navigation rules in applications that use Facelets technology.
In this application, no navigation rules are configured in <tt>faces-config.xml</tt>.
Instead, the navigation handler will try to locate a suitable page in the application.</p>
</li>
<li>Add the following methods that access the helper class to retrieve additional film details.
<pre class="examplecode"><strong> public String getLanguage() {
int langID = current.getLanguageByLanguageId().getLanguageId().intValue();
String language = helper.getLangByID(langID);
return language;
}
public String getActors() {
List actors = helper.getActorsByID(current.getFilmId());
StringBuffer totalCast = new StringBuffer();
for (int i = 0; i < actors.size(); i++) {
Actor actor = (Actor) actors.get(i);
totalCast.append(actor.getFirstName());
totalCast.append(" ");
totalCast.append(actor.getLastName());
totalCast.append(" ");
}
return totalCast.toString();
}
public String getCategory() {
Category category = helper.getCategoryByID(current.getFilmId());
return category.getName();
}</strong>
</pre>
</li>
<li>Fix your imports (Ctrl-Shift-I) and save your changes.</li>
</ol>
<p class="tips">You can use the code completion in the editor to help you type your code.</p>
<!-- **************** Creating the Web Pages **************** -->
<a name="08"></a>
<h2>Creating the Web Pages</h2>
<p>In this exercise you will create two web pages for displaying the data.
You will modify the <tt>index.xhtml</tt> generated by the IDE to add a table that displays the films in the database.
You will then create <tt>browse.xhtml</tt> to display a film's details when you click the "View" link in the table.
You will also create a JSF template page that is used by <tt>index.xhtml</tt> and <tt>browse.xhtml</tt>.</p>
<p class="tips">For more about using JSF 2.0 and Facelets templates, see
<a href="jsf20-intro.html">Introduction to JavaServer Faces 2.0</a></p>
<div class="indent">
<a name="07a"></a>
<h3>Creating <tt>template.xhtml</tt></h3>
<p>You will first create the JSF Facelets template <tt>template.xhtml</tt> that is used in the composition of the <tt>index.xhtml</tt> and <tt>browse.xhtml</tt> pages.</p>
<ol>
<li>Right-click the DVDStore project node in the Projects window and choose New &gt; Other.</li>
<li>Select Facelets Template in the JavaServer Faces category. Click Next.</li>
<li>Type <strong>template</strong> for the File Name and choose the first CSS layout style.</li>
<li>Click Finish.
<p>When you click Finish, the file <tt>template.xhtml</tt> opens in the editor.
The template contains the following default code.</p>
<pre class="examplecode">&lt;h:body&gt;
&lt;div id="top" class="top"&gt;
&lt;ui:insert name="top"&gt;Top&lt;/ui:insert&gt;
&lt;/div&gt;
&lt;div id="content" class="center_content"&gt;
&lt;ui:insert name="content"&gt;Content&lt;/ui:insert&gt;
&lt;/div&gt;
&lt;/h:body&gt;</pre></li>
<li>Modify the <tt>&lt;ui:insert&gt;</tt> element to change the default generated name to "body".
<pre class="examplecode">&lt;div id="content" class="center_content"&gt;
&lt;ui:insert name="<strong>body</strong>"&gt;Content&lt;/ui:insert&gt;
&lt;/div&gt;</pre>
</li>
<li>Save your changes.</li>
</ol>
<p>The content enclosed within the <tt>&lt;ui:define name="body"&gt;</tt> element in <tt>index.xhtml</tt> and <tt>browse.xhtml</tt>
will be inserted into the location identified with <tt> &lt;ui:insert name="body"&gt;Content&lt;/ui:insert&gt;</tt> in the template.</p>
<h3>Modifying <tt>index.xhtml</tt></h3>
<p>When you created the web application, the IDE automatically generated the page <tt>index.xhtml</tt>.
In this exercise you modify the page to display a list of film titles.
The JSF page calls the methods in the JSF Managed Bean FilmController to retrieve
the list of films and then displays a table with the film titles and descriptions.</p>
<ol>
<li>Expand the Web Pages folder in the Projects window and open <tt>index.xhtml</tt> in the editor.
<p>The New Project wizard generated the following default <tt>index.xhtml</tt> page.</p>
<pre class="examplecode">&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"&gt;
&lt;h:head&gt;
&lt;title&gt;Facelet Title&lt;/title&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
Hello from Facelets
&lt;/h:body&gt;
&lt;/html&gt;</pre></li>
<li>Modify the page to use the JSF <tt>&lt;ui:composition&gt;</tt> and <tt>&lt;ui:define&gt;</tt> elements and add a <tt>&lt;h:form&gt;</tt> element.
<pre class="examplecode">&lt;html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
<strong>xmlns:ui="http://java.sun.com/jsf/facelets"&gt;
&lt;ui:composition template="./template.xhtml"&gt;
&lt;ui:define name="body"&gt;
&lt;h:form&gt;
&lt;/h:form&gt;
&lt;/ui:define&gt;
&lt;/ui:composition&gt;</strong>
&lt;/html&gt;</pre>
<p>When you start typing the tags, the IDE adds <tt>xmlns:ui="http://java.sun.com/jsf/facelets"</tt> tag library declaration.</p>
<p>The <tt>&lt;ui:composition&gt;</tt> and <tt>&lt;ui:define&gt;</tt> elements are used in combination with the page
template that you will create.
The <tt>&lt;ui:composition&gt;</tt> element references the location of the template that will be used by this page.
The <tt>&lt;ui:define&gt;</tt> element references the position in the template that the enclosed code will occupy.</p>
</li>
<li>Add the following navigation links that call the <tt>previous</tt> and <tt>next</tt> methods in the JSF managed bean.
<pre class="examplecode">
&lt;ui:define name="body"&gt;
&lt;h:form&gt;
<strong>&lt;h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/&gt;&nbsp;
&lt;h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/&gt;&nbsp;</strong>
&lt;/h:form&gt;
&lt;/ui:define&gt;</pre>
</li>
<li>Add the following <tt>dataTable</tt> element (in bold) to generate the table to display the retrieved items.
<pre class="examplecode">
&lt;h:form styleClass="jsfcrud_list_form"&gt;
&lt;h:commandLink action="#{filmController.previous}" value="Previous #{filmController.pageSize}" rendered="#{filmController.hasPreviousPage}"/&gt;&nbsp;
&lt;h:commandLink action="#{filmController.next}" value="Next #{filmController.pageSize}" rendered="#{filmController.hasNextPage}"/&gt;&nbsp;
<strong>&lt;h:dataTable value="#{filmController.filmTitles}" var="item" border="0" cellpadding="2" cellspacing="0" rowClasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px"&gt;
&lt;h:column&gt;
&lt;f:facet name="header"&gt;
&lt;h:outputText value="Title"/&gt;
&lt;/f:facet&gt;
&lt;h:outputText value="#{item.title}"/&gt;
&lt;/h:column&gt;
&lt;h:column&gt;
&lt;f:facet name="header"&gt;
&lt;h:outputText value="Description"/&gt;
&lt;/f:facet&gt;
&lt;h:outputText value="#{item.description}"/&gt;
&lt;/h:column&gt;
&lt;h:column&gt;
&lt;f:facet name="header"&gt;
&lt;h:outputText value="&nbsp;"/&gt;
&lt;/f:facet&gt;
&lt;h:commandLink action="#{filmController.prepareView}" value="View"/&gt;
&lt;/h:column&gt;
&lt;/h:dataTable&gt;
&lt;br/&gt;</strong>
&lt;/h:form&gt;
</pre>
<li>Save your changes.</li>
</ol>
<p>The index page will now display a list of film titles in the database.
Each row in the table includes a "View" link that invokes the <tt>prepareView</tt> method in the managed bean.
The <tt>prepareView</tt> method returns "browse" and will open <tt>browse.xhtml</tt>.</p>
<p class="notes"><strong>Note.</strong> When you type the <tt>&lt;f:facet&gt;</tt> tag, the IDE will add <tt>xmlns:f="http://java.sun.com/jsf/core</tt>
tag library declaration.
<strong>Confirm that the tag library is declared in the file.</strong></p>
<!-- +++++++++++++++ Create browse.xhtml +++++++++++++++ -->
<a name="07b"></a>
<h3>Creating <tt>browse.xhtml</tt></h3>
<p>You will now create the <tt>browse.xhtml</tt> page for displaying details of the selected film.
You can use the Facelets Template Client wizard to create the page based on the JSF Facelets template <tt>template.xhtml</tt>
that you created.</p>
<ol>
<li>Right-click DVDStore project node in the Projects window and choose New &gt; Other.</li>
<li>Select Facelets Template Client in the JavaServer Faces category. Click Next.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-faceletsclient.png" alt="screenshot of Facelets Template Client in New File wizard" title="Facelets Template Client file type in New File wizard" class="margin-around b-all"></li>
<li>Type <strong>browse</strong> for the File Name.</li>
<li>Locate the Template for the page by clicking Browse to open the Browse Files dialog box.</li>
<li>Expand the Web Pages folder and select <tt>template.xhtml</tt>. Click Select File.<br/>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-browsetemplate.png" alt="screenshot of Browse Files dialog" title="Select the template in the Browse Files dialog" class="margin-around b-all"></li>
<li>Select <strong>&lt;ui:composition&gt;</strong> for the Generated Root Tag. Click Finish.
<p>When you click Finish, the file <tt>browse.xhtml</tt> opens in the editor with the following code.</p>
<pre class="examplecode">&lt;ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml"&gt;
&lt;ui:define name="top"&gt;
top
&lt;/ui:define&gt;
&lt;ui:define name="body"&gt;
body
&lt;/ui:define&gt;
&lt;/ui:composition&gt;</pre>
<p>You can see that the new file specifies the <tt>template.xhtml</tt> file and that the <tt>&lt;ui:define&gt;</tt> tag has the property <tt>name="body"</tt> </p>
</li>
<li>Add the following code (in bold) between the <tt>&lt;ui:define&gt;</tt> tags to create the form and
call the methods in the managed bean FilmController to retrieve the data and populate the form.
<pre class="examplecode">&lt;ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./template.xhtml"
<strong>xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"</strong>&gt;
&lt;ui:define name="top"&gt;
top
&lt;/ui:define&gt;
&lt;ui:define name="body"&gt;
<strong>
&lt;h:form&gt;
&lt;h:panelGrid columns="2"&gt;
&lt;h:outputText value="Title:"/&gt;
&lt;h:outputText value="#{filmController.selected.title}" title="Title"/&gt;
&lt;h:outputText value="Description"/&gt;
&lt;h:outputText value="#{filmController.selected.description}" title="Description"/&gt;
&lt;h:outputText value="Genre"/&gt;
&lt;h:outputText value="#{filmController.category}"/&gt;
&lt;h:outputText value="Cast"/&gt;
&lt;h:outputText value="#{filmController.actors}"/&gt;
&lt;h:outputText value="Film Length"/&gt;
&lt;h:outputText value="#{filmController.selected.length} min" title="Film Length"/&gt;
&lt;h:outputText value="Language"/&gt;
&lt;h:outputText value="#{filmController.language}" title="Film Length"/&gt;
&lt;h:outputText value="Release Year"/&gt;
&lt;h:outputText value="#{filmController.selected.releaseYear}" title="Release Year"&gt;
&lt;f:convertDateTime pattern="MM/dd/yyyy" /&gt;
&lt;/h:outputText&gt;
&lt;h:outputText value="Rental Duration"/&gt;
&lt;h:outputText value="#{filmController.selected.rentalDuration}" title="Rental DUration"/&gt;
&lt;h:outputText value="Rental Rate"/&gt;
&lt;h:outputText value="#{filmController.selected.rentalRate}" title="Rental Rate"/&gt;
&lt;h:outputText value="Replacement Cost"/&gt;
&lt;h:outputText value="#{filmController.selected.replacementCost}" title="Replacement Cost"/&gt;
&lt;h:outputText value="Rating"/&gt;
&lt;h:outputText value="#{filmController.selected.rating}" title="Rating"/&gt;
&lt;h:outputText value="Special Features"/&gt;
&lt;h:outputText value="#{filmController.selected.specialFeatures}" title="Special Features"/&gt;
&lt;h:outputText value="Last Update"/&gt;
&lt;h:outputText value="#{filmController.selected.lastUpdate}" title="Last Update"&gt;
&lt;f:convertDateTime pattern="MM/dd/yyyy HH:mm:ss" /&gt;
&lt;/h:outputText&gt;
&lt;/h:panelGrid&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;h:commandLink action="#{filmController.prepareList}" value="View All List"/&gt;
&lt;br/&gt;
&lt;/h:form&gt;
</strong>
&lt;/ui:define&gt;
&lt;/ui:composition&gt;
&lt;/html&gt;</pre>
<p>You can see that <tt>browse.xhtml</tt> and <tt>index.xhtml</tt> will use the same page template.</p>
</li>
<li>Save your changes.</li>
</ol>
<a name="07b"></a>
</div>
<a name="09"></a>
<h2>Running the Project</h2>
<p>The basics of the application are now complete. You can now run the application to check if everything is working correctly.</p>
<ol>
<li>Click Run Main Project in the main toolbar or right-click the DVDStore application node in the Projects window and choose Run.
<p>The IDE saves all changed files, builds the application, and deploys the application to the server.
The IDE opens a browser window to the URL <tt>http://localhost:8080/DVDStore/</tt> that displays the list of films.</p>
<img src="../../../images_www/articles/72/web/hibernate-webapp/hib-browser1.png" alt="Screenshot of browser displaying film list on index page" title="Screenshot of browser displaying film list on index page" class="margin-around b-all">
</li>
<li>In your browser, click "View" to load <tt>browse.xhtml</tt> to view the film details.<br/>
</li>
</ol>
<a name="10"></a>
<h3>Downloading the Solution Project</h3>
<p>You can download the solution to this tutorial as a project in the following ways.</p>
<ul>
<li>Download <a href="https://netbeans.org/projects/samples/downloads/download/Samples/JavaEE/DVDStoreEE6.zip">a zip archive of the finished project</a>.</li>
<li>Checkout the project sources from the NetBeans Samples by performing the following steps:
<ol>
<li>Choose Team &gt; Subversion &gt; Checkout from the main menu.</li>
<li>In the Checkout dialog box, enter the following Repository URL:<br/>
<tt>https://svn.netbeans.org/svn/samples~samples-source-code</tt><br/>
Click Next.</li>
<li>Click Browse to open the Browse Repostiory Folders dialog box.</li>
<li>Expand the root node and select <strong>samples/javaee/DVDStoreEE6</strong>. Click OK.</li>
<li>Specify the Local Folder for the sources.</li>
<li>Click Finish.
<p>When you click Finish, the IDE initializes the local folder as a Subversion repository
and checks out the project sources.</p>
</li>
<li>Click Open Project in the dialog that appears when checkout is complete.</li>
</ol>
<p class="notes"><strong>Notes.</strong>
For more about installing Subversion, see the section on <a href="../ide/subversion.html#settingUp">Setting up Subversion</a> in the <a href="../ide/subversion.html">Guide to Subversion in NetBeans IDE</a>.</p>
</li>
</ul>
<a name="11"></a>
<h3>Troubleshooting</h3>
<p>Most of the problems that occur with the tutorial application are due to communication
difficulties between the GlassFish Server Open Source Edition and the MySQL database server.
If your application does not display correctly, or if you are receiving a server error,
you might want to look at the <a href="mysql-webapp.html#troubleshoot">Troubleshooting</a> section of the
<a href="mysql-webapp.html">Creating a Simple Web Application Using a MySQL Database</a> tutorial or the
<a href="../ide/mysql.html">Connecting to a MySQL Database</a> tutorial.</p>
<p>If you download and run the solution project you might see the following
error in the Output window if it is the first time that you have deployed an application that uses
the MySQL database.</p>
<pre class="examplecode">
SEVERE: JDBC Driver class not found: com.mysql.jdbc.Driver
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1509)
[...]
at java.lang.Thread.run(Thread.java:680)
SEVERE: Initial SessionFactory creation failed.org.hibernate.HibernateException: JDBC Driver class not found: com.mysql.jdbc.Driver
INFO: cleaning up connection pool: null
INFO: Domain Pinged: stable.glassfish.org</pre>
<p>In your browser window you might see a <tt>java.lang.ExceptionInInitializerError</tt>
and the following stack trace.</p>
<pre class="examplecode">
java.lang.ExceptionInInitializerError
at dvdrental.HibernateUtil.&lt;clinit&gt;(HibernateUtil.java:28)
...
Caused by: org.hibernate.HibernateException: JDBC Driver class not found: com.mysql.jdbc.Driver
...
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
... </pre>
<p>The output message states that the JDBC driver for the MySQL database was not found.
The most probable reason is that you need to add the MySQL JDBC driver file to your GlassFish server installation.
To confirm that the driver is missing, navigate to the <tt><em>GLASSFISH-INSTALL</em>/glassfish/domains/domain1/lib</tt>
directory on your local system (where <em>GLASSFISH-INSTALL</em> is your GlassFish installation directory).
If the <tt>domain1/lib</tt> directory does not contain the JDBC driver file
(for example, <code>mysql-connector-java-5.1.13-bin.jar</code>) you need to copy the
JDBC driver to the directory.
The MySQL JDBC driver is not added to your GlassFish installation when you install the server.
</p>
<p>You can add a copy of the MySQL JDBC driver to your GlassFish installation by performing the
following steps.
<ol>
<li>Download the <a href="http://dev.mysql.com/downloads/connector/j/">MySQL Connector/J JDBC driver</a>.</li>
<li>Extract the driver and copy the driver file (for example, <code>mysql-connector-java-5.1.13-bin.jar</code>)
to the <tt>domain1/lib</tt> directory of your GlassFish installation.</li>
</ol>
<p>Alternatively, when you use the IDE to create an application that uses the MySQL database,
the IDE can automatically copy the bundled MySQL JDBC driver
to the GlassFish server when you deploy the project, if required.
To confirm that the IDE will copy the necessary JDBC drivers,
choose Tools &gt; Servers from the main menu to open the Servers manager
and confirm that the Enable JDBC Driver Deployment option is selected
for your GlassFish server.</p>
<p>After you create and deploy a web application that uses the MySQL database,
if you navigate to the <code>domain1/lib</code> directory of your local GlassFish
installation you will see that directory contains the JDBC driver file.</p>
<div class="feedback-box"><a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Using%20Hibernate%20in%20a%20Web%20Application">Send Feedback on This Tutorial</a></div>
<br style="clear:both;" />
<h2>See Also</h2>
<ul>
<li><a href="jsf20-support.html">JSF 2.x Support in NetBeans IDE</a></li>
<li><a href="jsf20-intro.html">Introduction to JavaServer Faces 2.x</a></li>
<li><a href="../../trails/java-ee.html">Java EE &amp; Java Web Learning Trail</a></li>
</ul>
</body>
</html>