Matt RaibleMatt Raible is a Java Champion and Developer Advocate at Okta.

The JHipster Mini-Book The JHipster Mini-Book is a guide to getting started with hip technologies today: Angular, Bootstrap, and Spring Boot. All of these frameworks are wrapped up in an easy-to-use project called JHipster.

This book shows you how to build an app with JHipster, and guides you through the plethora of tools, techniques and options you can use. Furthermore, it explains the UI and API building blocks so you understand the underpinnings of your great application.

For book updates, follow @jhipster-book on Twitter.


Over 10 years ago, I wrote my first blog post. Since then, I've authored books, had kids, traveled the world, found Trish and blogged about it all.

Hibernate Upgade: 1.2.3 to 2.0 (My Story)

I'm upgrading struts-resume to Hibernate 2.0 tonight. I thought I'd blog my adventure and what I needed to change.

Step 1: Patch XDoclet to allow specifying the DTD in the generated .hbm.xml files.

Step 2: Download Hibernate 2.0 beta 2. It's at the bottom of the preceding link.

Step 3: Extract to struts-resume/lib and change to version 2.0.

Step 4: Edit build.xml file to pick up the new DTD. I changed <hibernate/> to be <hibernate validatexml="true" version="2.0"/>.

Step 5: Using HomeSite, I did s/cirrus.hibernate/net.sf.hibernate/g. 14 matches. The project currently has 3 DAO's and a ServiceLocator to get Hibernate Sessions.

Step 6: ant clean deploy Not too bad, only one compile error.
D:\source\appfuse\src\ejb\org\appfuse\persistence\ cannot resolve symbol
symbol : class Datastore
location: package hibernate
import net.sf.hibernate.Datastore;

Step 7: Open up Eclipse, refresh the project and right click on the project name, click Properties >> Java Build Path. Change path for hibernate.jar to struts-resume/lib/hibernate-2.0/hibernate.jar. Remove the previous path.

Step 8: Go searching for what the heck happened to Datastore. Hibernate CVS is first choice. Pause to post (per chance someone reads and sends solution).

Step 9: Step 4 from the Hibernate 2 Porting Guidelines. Replacing attribute names, DTDs and changed throws SQLException to JDBCException in ServiceLocator class.

Step 10: Repeat Step 5 for all Unit tests (they live in "test," rather than "src"). End up repeating for entire project, makes about 1800 replacements - hibernate-1.2.3/src was in search path. Remove lib/hibernate-1.2.3.

Step 11: Revisit Step 8 and try to use new Configuration API. Tried this...
Datastore datastore = Hibernate.createDatastore() - changed to Configuration config = new Configuration();

Not working yet... But Gavin has responded to the mailing list and Chiara is listening. Good to have the support ;-)

Step 12: Found a problem with XDoclet, modifying source. Changing "role" attribute to "name" for the following types (in order replaced by HomeSite): subcollection, collection, set, bag, list, map, array, primitive-array. Rebuilt hibernate module. Changed attribute "readonly" to "inverse" and tried again. Changes to set and bag only.

Step 13: I'm using the Configure.configure() method to initialize from hibernate.cfg.xml (I had to rename the package for my dialect from cirrus.hibernate.sql.MySQLDialect to net.sf.hibernate.dialect.MySQLDialect). I doubt it'll work though since this expects a JNDI DataSource.

Step 14: Nope, that didn't work. I found out I needed to remove the "length" attribute from any <key> elements in <bag>'s. Back to trying to use config.addClass().

Step 15: Internet connection goes down, reboot router. Change dialect package name in This file is renamed to and used for running JUnit tests. Now time to have fun with JUnit and get UserDAOTest to run.

I'm getting a connection to the database now thanks to Gavin's advice:
sf = new Configuration()

Step 16: Changed xdoclet tags "inverse" attribute to be "false" where previously readonly="true", now inverse="false". Now I'm getting the following error:

[junit] java.sql.BatchUpdateException: Invalid argument value: Duplicate entry '0' for key 1
[junit] at com.mysql.jdbc.jdbc2.PreparedStatement.executeBatch(Unknown Source)

Whenever I try to run the addResume test for a user. The mapping looks fine, I'll try dropping and re-creating the database. Found I needed to change the package names in build.xml. Note to upgraders: don't filter by file extension when replacing the package name.

Discovered that the SchemaExport class had moved from to net.sf.hibernate.tool.hbm2ddl.

Step 17: The UserDAOTest runs successfully. Now for the web...

Couldn't get "ant test-canoo" (Canoo WebTest) to run until I copied xerces.jar back into lib/hibernate-2.0/lib. Changed my to use new package name for logging.

After looking at some 2.0 documentation, I discovered a new DTD for hibernate-configuration. Unfortunately, it's not there. So I put it on this site as a workaround. Got rid of startup errors. One change in the DTDs is that all <property> declarations must be within a <session-factory> element.

Now I can't get Hibernate to connect to JNDI. Back to the doco...

(5 minutes later) Yep, right in the doco. I changed to have the following:
SessionFactory sf =
  new Configuration().configure().buildSessionFactory();

Now, when I login I'm getting:

at org.apache.commons.dbcp.PoolingDataSource.getConnection(
at org.apache.commons.dbcp.BasicDataSource.getConnection(

Since my Unit tests on the business level run, I'm guessing it's something wrong with this line in hibernate.cfg.xml:
  <property name="connection.datasource">java:comp/env/jdbc/resume</property>

Get a good nights sleep; zonked out at 3, up at 8:30 to continue...

Step 18: Find out (from Gavin) that there's probably a file in my classpath that is causing the problem. I find this fine inside hibernate.jar. Doh! There's an error in packaging. ;-) I remembering seeing this sometime last week on the mailing list. I decide to upgrade to Hibernate 2.0 beta 3, which was released while I was sleeping. The file is removed from hibernate2.jar in this release. I did have to update lib/ to handle the change of jar-name. Compiling, testing...

Dropped and re-created the database b/c I was getting duplicate key errors. Ran UserDAOTest - BUILD SUCCESSFUL - run it again - BUILD FAILED.

Further updates to hibernate-properties.xdt to replace paramName="role" to paramName="name", also replaced paramName="readonly" with paramName="inverse". Sent an e-mail to xdoclet-devel inquiring about best way to make hibernate-properties.xdt both 2.0 and 1.1-compatible.

This change in XDoclet makes UserDAOTest pass - so it looks like the upgrade is a success. Now I just have to figure out a way to convince the XDoclet team to add support for Hibernate 2.0. This might take awhile, it has for POJO -> StrutsForms support (still pending).

Posted in Java at Feb 23 2003, 11:03:02 PM MST 6 Comments

Safari v. 62 has tabbed browsing?

Safari Icon According to these comments from Dave Hyatt's weblog, the current dev version of Safari has tabbed browsing, as well as auto-fill. Is it a conspiracy or true? I hope it's true.

Posted in Mac OS X at Feb 23 2003, 04:54:35 PM MST 2 Comments

Use Maven? Experience says no...

I've been wanting to upgrade struts-resume to use Maven, but after reading Patrick's post, I might just change my mind.

And after 2 years of using Ant, Maven (which uses Jelly and Werkz as the underlying engines) behaves differently enough from Ant to utterly frustrate me. So I'm back heading back to the drawing board for new ideas.

Of course, my hope is to integrate Maven without losing Ant and let them both live beside each other intimately. Someday it will be done...

Posted in Java at Feb 23 2003, 04:30:52 PM MST 1 Comment

My Mom is Famous!

Oregon crews to join shuttle debris search. Salem firefighters will use grid skills to find Columbia wreckage.

My mom and dad both told me that she was going to be heading out to do this, but I didn't think she'd get famous for it! Granted, Salem is a smaller town (100,000), but this is pretty big news to me and makes me extremely proud. Way to go Mom!!

photo from Statesman's Journal
THOMAS PATTERSON / Statesman Journal
Effie Frazier (left) of the Salem district Bureau of Land Management fire crew, weighs her pack Thursday before heading to Texas to search for pieces of the space shuttle Columbia. Each member is permitted to bring 65 pounds, but Frazier's pack was 3 pounds too heavy. BLM surveyor Bob Aarseth holds the scale and crew boss Barb Raible (right) looks on.

Posted in General at Feb 23 2003, 10:32:14 AM MST Add a Comment

Having trouble with Struts' Nested Tags on Tomcat 4.1.18?

If you're having trouble running Struts' Nested Tag Library on Tomcat 4.1.18, then you should probably checkout Arron's (original author) posting to the struts-dev mailing list. There's a patch available on this post.

Posted in Java at Feb 23 2003, 10:19:59 AM MST Add a Comment

[ANNOUNCEMENT] Struts 1.1 Release Candidate 1 Released!

The Struts team is proud to announce the release of Struts 1.1 Release Candidate 1. This release includes some new functionality, as well as fixes for a number of bugs which were reported against earlier versions. The Struts Team believes that this release is ready for prime time, hence its designation as a release candidate.

The binary distribution is available at:

and the source distribution is available at:

In addition, the library distribution, which contains updated binaries without the sample applications, is available at:

Details of the changes in this release are available in the Release Notes, which can be found here:

Get it while it's hot!

Posted in Java at Feb 23 2003, 10:15:12 AM MST Add a Comment

Skiing Yesterday

Yesterday was an epic day of skiing at Breckenridge. Knee-deep powder, no lift lines and skiing with a good friend made the day perfect. The two hour drive up there and the 45 wait for a bus in the parking lot wasn't even too bad. I left my house at 8:30 and was on a lift at 11:30. Keep in mind, this is usually a 1 hour, 15 minute drive. My buddy, also named Matt, talked me into skiing all the way until 4. I was beat, but I'm glad I did it 'cause the snow was awesome.

The way home was a whole different story. We knew traffic was going to be bad, since it was awful on the way up. So we stopped and had some dinner and left Frisco (near Breckenridge) at 7:00 p.m. The freeway (I-70) seemed pretty good until I hit Loveland pass, about 10 miles from Frisco. There, traffic ground to a halt. It was the worst traffic jam I have ever seen - it took me 3 hours to go 15 miles! By the time I got home last night it was 11:00!! Yikes - so I'm going to skip skiing today even though they got 16 inches at Vail. [Colorado Web Cams]

The good news is that I have tomorrow off, so I hope to go again. The reason I'm off is because Comcast hasn't paid my contracting company since we started there. Supposedly, the check is in the mail, but my contracting company is tired of floating our paychecks (can't blame them), so they've asked us to stay home until they receive the check. I don't mind, but I will if I'm still not working my mid-week. Now would be the perfect time to find a job in Florida! Oh wait - it is a perfect time - it's dumping snow in the mountains and I don't have to go to work!! me smiling

Posted in General at Feb 23 2003, 10:11:17 AM MST 1 Comment