http://www.warfrog.com/hibernatetutorial/

Hibernate / Spring / Middlegen / XDoclet Tutorial v1.5#

Part 1 in the Warfrog.com Hibernate tutorial series#

written by Tyler Pitchford http://www.warfrog.com


Before we begin

What this tutorial covers

This tutorial is built to help java developers get Hibernate, Spring, Middlegen and XDoclet up an running in a timely fashion. When I first began learning Hibernate, Spring, Middlegen, and XDoclet, I was overwhelmed by how large and involved each package was. Literally, there are thousands of files to deal with, vast amounts of jars to wade through, and so many different xml files that it's hard to know where to start. There are several excellent tutorials available online and they all were useful in someway to me, but none of them pandered to my way of learning, by example. In response, I've attempted to compile them into a single tutorial, allowing developers like myself to get up to speed on these great technologies faster. In essence, this tutorial is a "shortest" path example to getting all of these wonderful technologies working. Once you've completed this tutorial you should have a development process for integrating Hibernate, Spring, Middlegen, and XDoclet into your future projects.

What this tutorial doesn't cover

This tutorial won't review how Hibernate, Spring, Middlegen, or XDoclet work. Additionally, this tutorial won't review the files I provide in the hibernatetutorial.zip. This may seem odd at first, but the documentation I've provided in the files does a great job of explaining them. If you find the documentation lacking and you have any questions please feel free to email me using the email address I've provided in the resource section, I'm always glad to help. Additionally, I can be contact on the irc.freenode.net under the handle TdC_VgA.


Downloading / Installing optional software

Install Command Prompt Here

Download: CmdHere.reg.txt URL: http://www.tburke.net/info/win2k/regfiles/CmdHere.reg.txt Install: Save CmdHere.reg.txt Rename CmdHere.reg.txt to cmdhere.reg Right click on cmdhere.reg -> Merge

Install Eclipse

Download: eclipse-platform-2.1.X-win32.zip URL: http://www.eclipse.org/downloads/index.php Extract file to c:\java\eclipse (you can use any directory you like, I'll be assuming C:\java\eclipse though)

Note: If you install Eclipse to a different directory, you'll need to edit the supplied build.xml file's eclipse.dir property to reflect your Eclipse installation directory.

Install ANT

Get newest version URL: http://ant.apache.org/manual/index.html Install: Follow instructions at the URL above

Setting up the project

Launch Eclipse

File->New->Project Select Java Project Click Ok Project Name = "hibernatetutorial" Click Next Make sure the source tab is selected and click the Add Folder button Click the "Create New Folder" button Type in "src" Click OK

Click Yes to the "Do you want to..." message Click Finish Minimize Eclipse, we're done using it for now

Create the staging folder

Note: I picked C:\hibernatetutorial, you can use whatever you like, but I'll be assuming C:\hibernatetutorial for the rest of this document.

Extract the hibernatetutorial.zip to C:\hibernatetutorial. After that you'll need to open a command prompt to c:\hibernatetutorial and type "ant setup-dirs"

OR if you've decided not to use ANT

Create the following directories:

* C:\hibernatetutorial\apps * C:\hibernatetutorial\apps\hibernate * C:\hibernatetutorial\apps\hibernate-ext * C:\hibernatetutorial\apps\middlegen * C:\hibernatetutorial\apps\spring * C:\hibernatetutorial\apps\xdoclet * C:\hibernatetutorial\apps\hsqldb * C:\hibernatetutorial\lib * C:\hibernatetutorial\lib\hibernate * C:\hibernatetutorial\lib\spring * C:\hibernatetutorial\lib\xdoclet * C:\hibernatetutorial\lib\hsqldb * C:\hibernatetutorial\hsqldb * C:\hibernatetutorial\downloads (optional - used for storing the downloads)

Time to install some software

Note: Every "extract the zip file..." line below means extract the zip file directly to the folder. Do not change the root dir and/or "extract to FILENAME directory." There may be some repetitive folder names, just ignore them (ex. C:\hibernatetutorial\apps\hsqldb\hsqldb ). If you change the root directory you'll need to manually edit the build.xml, I've provided, to point to the correct application roots. Additionally, if any of the versions of the software listed below change you'll need to update the build.xml.

Install HSQLDB

Download: hsqldb_1_7_X.zip File used in this tutorial: hsqldb_1_7_1.zip URL: http://sourceforge.net/project/showfiles.php?group_id=23316&release_id=117043 Install: Extract the zip file to the hsqldb directory within the apps directory

Install Hibernate

Download: hibernate-2.1.x.zip File used in this tutorial: hibernate-2.1.3.zip URL: http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc Install: Extract to the hibernate directory inside the apps directory

Install Hibernate extensions

Download: hibernate-extensions-2.1.X.zip File used in this tutorial: hibernate-extensions-2.1.2.zip URL: http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc Install: Extract to the hibernate-ext directory inside the apps directory

Install Middlegen

Download: Middlegen-Hibernate-rX.zip File used in this tutorial: Middlegen-Hibernate-r4.zip URL: http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc Install: Extract to the middlegen directory inside the apps directory

Open a command prompt to c:\hibernatetutorial and type "ant setup-middlegen"

OR if you've decided not to use ANT

Copy the following files:

* C:\hibernatetutorial\apps\hibernate\lib\commons-lang-1.0.X.jar * C:\hibernatetutorial\apps\hibernate\hibernate2.jar * C:\hibernatetutorial\apps\hibernate-ext\tools\lib\jdom.jar * C:\hibernatetutorial\apps\hibernate-ext\tools\hibernate-tools.jar

to the C:\hibernatetutorial\apps\middlegen\lib directory

Delete the following directories / files:

* C:\hibernatetutorial\apps\middlegen\build * C:\hibernatetutorial\apps\middlegen\src * C:\hibernatetutorial\apps\middlegen\build.xml * C:\hibernatetutorial\apps\middlegen\config\database\hsqldb.xml

Copy the build.xml, provided in the hibernatetutorial.zip, to C:\hibernatetutorial\apps\middlegen\. Additionally, copy the hsqldb.xml to the C:\hibernatetutorial\apps\middlegen\config\database\hsqldb.xml.

Install XDoclet

Download: xdoclet-bin-1.X.zip File used in this tutorial: xdoclet-bin-1.2.zip URL: http://sourceforge.net/project/showfiles.php?group_id=31602 Install: Extract to the xdoclet directory

Install Spring Framework

Download: spring-framework-1.0.X-with-dependencies.zip File used in this tutorial: spring-framework-1.0.1-with-dependencies.zip URL: http://sourceforge.net/project/showfiles.php?group_id=73357 Install: Extract to the spring directory inside the apps directory

Gather up all the jars for our app

Open a command prompt to c:\hibernatetutorial and type "ant copy-jars-to-lib"

OR if you've decided not to use ANT

Hibernate Jars

Copy all the jars from the C:\hibernatetutorial\apps\hibernate\lib Copy the hibernate2.jar from the C:\hibernatetutorial\apps\hibernate\ to C:\hibernatetutorial\lib\hibernate

Spring Jars

Copy all the jar and dtd files from C:\hibernatetutorial\apps\spring\dist Copy aopalliance.jar from C:\hibernatetutorial\apps\spring\lib\aopalliance to C:\hibernatetutorial\lib\spring

HSQLDB Jars

Copy the hsqldb.jar from C:\hibernatetutorial\apps\hsqldb\lib to C:\hibernatetutorial\lib\hsqldb

Setup the HSQLDB database

Launch the HSQLDB GUI

Launch a command prompt to c:\hibernatetutorial\lib\hsqldb directory. Launch the HSQLDB GUI by typing "java -cp hsqldb.jar org.hsqldb.util.DatabaseManager" Set the type to: HSQL Database Engine Standalone Set the URL to: jdbc:hsqldb:../../hsqldb/hibernatetutorial Leave the rest of the settings alone Click Ok

Two files were just created that make up the hibernatetutorial database

* C:\hibernatetutorial\hsqldb\hibernatetutorial.properties * C:\hibernatetutorial\hsqldb\hibernatetutorial.script

Create the GROUPS Table

Paste the following code into the text box next to the execute button

CREATE TABLE GROUPS ( group_id int NOT NULL IDENTITY, name LONGVARCHAR(255) NOT NULL, registration_date DATE NOT NULL, annual_budget decimal(20,4) NOT NULL )

Hit execute

Create the USERS Table

Paste the following code into the text box next to the execute button

CREATE TABLE USERS ( user_id int NOT NULL IDENTITY, group_id int, first_name LONGVARCHAR(255) NOT NULL, last_name LONGVARCHAR(255) NOT NULL, dob DATE NOT NULL, ssn LONGVARCHAR(20) NOT NULL, phone LONGVARCHAR(20) NOT NULL, salary decimal(20,4) NOT NULL, active bit DEFAULT 'true' NOT NULL, foreign key (group_id) references groups (group_id) )

Hit execute Close the GUI but leave the console open, we'll be using it in a minute.

Launch the HSQLDB Server

You've just created the groups and users tables we'll be using in our tutorial. Now all we have to do is launch the HSQLDB Server so we can access the database easily from our application.

Open another command prompt to the C:\hibernatetutorial\hsqldb directory. Make sure you don't use the command prompt we launched the HSQLDB GUI from, create another command prompt, because we'll be using it in a minute to test our database. Launch the HSQLDB server by typing "java -cp ../lib/hsqldb/hsqldb.jar org.hsqldb.Server -database hibernatetutorial" at the command prompt. If all went as planned you should see something similar to "Wed Apr 28 17:45:44 EDT 2004 Listening for connections ..." at the bottom of the command prompt. However, if you see "java.sql.SQLException: The database is already in use by another process", make sure you've closed the HSQLDB GUI.

Test the HIBERNATETUTORIAL Database

Relaunch the HSQLDB GUI. Set the type to: HSQL Database Engine Server Leave the rest of the settings alone Click Ok

Assuming everything has gone smoothly you should see the GROUPS and USERS tables in the lefthand tree. Congratulations, you're HSQLDB is now fully operation and you're ready to move on to generating you first Hibernate Mapping files. Once again, leave the HSQLDB GUI open.

Using Middlegen

Launching Middlegen

Open a command prompt to C:\hibernatetutorial\apps\middlegen\Middlegen-Hibernate-r4 and type "ant middlegen." You should now see a screen containing your GROUPS and USERS tables. Click on the title bar of the GROUPS table and change the Key Generator type to "Native." Repeat the same process for USERS table. Click the Generate button and wait for it to turn back to light grey. Close the Middlegen GUI.

In the C:\hibernatetutorial\apps\middlegen\Middlegen-Hibernate-r4 directory there should be two new directories, src and build. Navigate to C:\hibernatetutorial\apps\middlegen\build\gen-src\com\warfrog\hibernatetutorial\hibernate; there should be two files Group.hbm.xml and User.hbm.xml. Open the Group.hbm.xml for editing, we need to make a slight modification. Once you've opened the Group.hbm.xml, scroll down till you see the <set> tag (near the bottom) and add the line:

cascade="save-update"

below 'inverse="true". The <set> tag should now look like this:

<set name="users" lazy="true" inverse="true" cascade="save-update" >

Additionally, add

cascade="save-update"

below the "inverse="true"" within the <meta> tag. These modifications inform hibernate that when a Group object is saved it should also save and/or update all the User objects associated to the Group. Save the Group.hbm.xml and exit your editor.

At the middlegen command prompt type "ant hbm2java". Assuming that all went well you should see two new .java files (Group.java and User.java) inside the C:\hibernatetutorial\apps\middlegen\Middlegen-Hibernate-r4\build\gen-src\com\warfrog\tutorial\hibernate directory. Both java files should contain all the Hibernate XDoclet information required to generate the Group and User hbm.xml files and from the hbm.xml files you can generate the Database schema using the hbm2ddl tool, gotta love full circle development.

Using Hibernate

Setup the Eclipse Project

Open a command prompt to c:\hibernatetutorial and type "ant setup-eclipse-project"

OR if you've decided not to use ANT

Move to C:\java\eclipse\workspace\hibernatetutorial. Copy the "com" directory from the C:\hibernatetutorial\apps\middlegen\build\gen-src\ directory to C:\java\eclipse\workspace\hibernatetutorial\src. Additionally, copy C:\hibernatetutorial\lib directory to C:\java\eclipse\workspace\hibernatetutorial. Finally, copy all the files from the hibernatetutorial.zip\project files into C:\java\eclipse\workspace\hibernatetutorial.

Add the JARs to your eclipse classpath

First, right click on the "hibernatetutorial" folder icon and select "Refresh". Now, right click on the "hibernatetutorial" folder icon and select Properties. Click on the Java Build path, then the "Libraries" tab and hit the "Add JARs" button. Navigate to your hibernatetutorial\lib directory and add all the jars from each folder (hibernate, hsqldb, spring, etc.). Once you've selected all of the jars, click the Ok button.

Note: use SHIFT+ LEFT_CLICK to select a "block" of jars.

Testing your Hibernate project

Double click on the HibernateTutorial.java (found under default package inside eclipse), then click the arrow on the right hand side of the "running man" icon, then select Run As->Java Application. Click Ok to any prompts. If you've setup everything correctly, you should see a bunch of data scroll and some insert statements executing. Execute "SELECT * FROM GROUPS" inside the HSQLDB GUI and "SELECT * FROM USERS" to verify that the data is in the database. One record should be returned from the GROUPS table and 5 records from the USERS table. Congratulations, you now have a working Hibernate program.

Adding in Spring

Adding Spring into the mix

I've provided the required files to integrate Spring into the project (UserDAO.java, UserDAOImpl.java, applicationContext.xml, ApplicationContextFactory.java, and HibernateSpringTutorial.java). The UserDAO object provides a few sample "find" methods to simply retrieval of User objects. Additionally, the applicationContext.xml provides information to the Spring framework about sessions, transactions, etc.

Named Queries

A nice feature of Hibernate is the ability to place queries outside of code and in the .hbm.xml files, called named queries. In this section we'll modify the User.hbm.xml and insert a named query. Open the User.hbm.xml inside Eclipse for editing. Depending on your settings you may have to right click on the User.hbm.xml and select Open With -> Text Editor. Scroll down to the bottom of the file and modify

</class> </hibernate-mapping>

to this:

</class> <query name="UsersByDobRange"> <!CDATA[from User user where user.dob between ? AND ?]> </query> </hibernate-mapping>

Testing your Hibernate Spring project

Double click on the HibernateSpringTutorial.java (found under the default package inside eclipse), then click the arrow on the right hand side of the "running man" icon, then select Run As->Java Application. Click Ok to any prompts. If you've setup everything correctly, you should see a bunch of data scroll and SQL statements and then two exceptions being thrown. The first exception was caught inside a transaction and rolled back when the exception was throw, because we instructed Spring, inside the applicationContext.xml, to "wrap" a transaction around the "addGroupSafe" method of the UserDAOImpl class. The second exception thrown wasn't rolled back, resulting in a "MALFORMED_GROUP_2" group entry being added to our database. You can tell the "addSafe" method call was rolled back by executing "SELECT * FROM GROUPS" in the HSQLDB GUI. You should see an entry for MALFORMED_GROUP_2, but not MALFORMED_GROUP_1. In the next section we'll make a slight modification to the applicaionContext.xml and wrap both methods in transactions.

Modifying the Transactions

Spring allows you to remove all of the messy session.beginTransaction, commit(), rollback(), etc. code from you method calls. With Spring you can define what methods utilize transactions and which methods don't using the Application Context. In this section we'll modify the applicationContext.xml to allow Spring to handle the transaction management for the "malformed" addGroup calls.

Open the applicationContext.xml inside Eclipse for editing. Once you have the file opened, scroll down to the bottom of the file where you see these lines:

<prop key="addGroupSafe">PROPAGATION_REQUIRED</prop> <!--<prop key="addGroup*">PROPAGATION_REQUIRED</prop>-->

modify them so they look like this

<!--<prop key="addGroupSafe">PROPAGATION_REQUIRED</prop>--> <prop key="addGroup*">PROPAGATION_REQUIRED</prop>

What you've done is told spring to lookout for any method starting with the signature "addGroup" and wrap it in a transaction. Save the modified applicationContext.xml and re-run HibernateSpringTutorial.java. Once the program has finished executing, you should notice that both "malformed" save calls where rolled back by Spring. If you, once again, execute "SELECT * FROM GROUPS" inside the HSQLDB GUI, you'll noticed that no new groups have been inserted into the table.

XDoclet

Launching XDoclet

I've included a build.xml that will allow you to generate hbm.xml files from the Java source files we generated in the MiddleGen section. Select "Run Ant", making sure the "generate-hbm-from-xdoclet" task is checked and press Ok. You should see some output similar to the lines below:

Buildfile: C:\java\eclipse\workspace\hibernatetutorial\build.xml

generate-hbm-from-xdoclet: hibernatedoclet (XDocletMain.start 47 ) Running <hibernate/> hibernatedoclet Generating mapping file for com.warfrog.hibernatetutorial.hibernate.Group. hibernatedoclet com.warfrog.hibernatetutorial.hibernate.Group hibernatedoclet Generating mapping file for com.warfrog.hibernatetutorial.hibernate.User. hibernatedoclet com.warfrog.hibernatetutorial.hibernate.User BUILD SUCCESSFUL Total time: 3 seconds

Now, right click on the hibernatetutorial icon and select Refresh. This should cause a new folder, xdoclet.com.warfrog.hibernatetutorial.hibernate, to appear under your src folder. Inside the xdoclet folder you'll find the Group.hbm.xml and User.hbm.xml files that were generated by XDoclet. If you compare the hbm.xmls generated by Middlegen and hbm.xmls generated by XDoclet you'll notice that Date fields have been converted from type "java.sql.Date" to "java.util.Date." Additionally, you'll notice that XDoclet has inserted some default values that we didn't supply in our Java XDoclet metadata, fortunately neither of these modification should cause any problems.

Conclusion

Conclusion

Hopefully, this tutorial has allowed you to get Hibernate, Spring, Middlegen, and XDoclet working and given you a good basis for building future projects using these great tools. Additionally, you should now have a development process that allows you to start with a Database, generate the Mappings, generate the Java objects, and start using them quickly. From theret you can modify the Java objects, regenerate the mappings and using hdm2ddl update the database, if you'd like. As I stated previously, if you have any questions or comments please contact me at either the IRC Handle or the email address listed in the resource section. If you enjoyed part 1 of this tutorial you should move on to part 2 where I provide additional information on creating Many 2 Many and Inheritance mappings using Hibernate and Middlegen.

Cheers, Tyler Pitchford Senior Developer - Warfrog.com

Resources

Other tutorials

Warfrog Hibernate tutorial series part 2 - Hibernate / Middlegen: http://www.warfrog.com/hibernatetutorial2 Introduction to Hibernate: http://www.systemmobile.com/articles/IntroductionToHibernate.html MiddleGen-Hibernate Example: http://www.systemmobile.com/articles/IntroductionToHibernate.html Object-relation mapping without the container: http://www-106.ibm.com/developerworks/library/j-hibern/?ca=dnt-515 Object to Relational Mapping and Relationships with Hibernate: www.meagle.com:8080/hibernate.jsp

Links

Ant: http://ant.apache.org/ Ant Documentation: http://ant.apache.org/manual/index.html Eclipse: http://www.eclipse.org/ Eclipse Documentation: http://www.eclipse.org/ Hibernate: http://www.hibernate.org Hibernate Documentation: http://www.hibernate.org/hib_docs/reference/en/html/ Spring: http://www.springframework.org/ Spring Documentation: http://www.springframework.org/documentation.html Middlegen: http://boss.bekk.no/boss/middlegen/ Middlegen Documenation: http://boss.bekk.no/boss/middlegen/project-info.html XDoclet: http://xdoclet.sourceforge.net/ XDoclet Documenation: http://xdoclet.sourceforge.net/project-info.html Hibernate - Xdoclet: http://www.hibernate.org/72.html Hibernate - Spring: http://hibernate.bluemars.net/110.html

IRC Help

  1. hibernate on irc.freenode.org
  2. spring on irc.freenode.org
  3. java on irc.freenode.org

Contact Info

IRC Handle: TdC_VgA tyler_pitchford <remove>at<remove> yahoo.com

Downloads

Tutorial Files: hibernatetutorial.zip

Change Log

Revisions

v1.0 - Inital Release v1.1 - Reworded a few parts and corrected a few typos v1.2 - Updated tutorial to work with Middlegen-Hibernate-r4 v1.3 - Updated packaging inconsistencies in hibernatetutorial.zip v1.4 - Updated the hibernatetutorial.zip again v1.5 - Moved the ANT installation information

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 06-Apr-2006 09:45 by UnknownAuthor