When you already have a database and you want to use JPA or Hibernate to access that database you need something that will generate those POJO classes for you with the appropriate annotations. There are some existing solutions but I was not happy with them, so this is Yet Another Pojo Generator.

The generator gets generates as part of the build of DomUI and can be found as utilities/hibernate-generator/target/hibernate-generator.jar, and can be executed as:

java -jar hibernate-generator.jar

The generator so far should work for PostgreSQL and Oracle, with PostgreSQL the one that has been tested. Adding new database types should not be too hard.

The generator does the following:


An example command line invocation would be:

java -jar hibernate-generator.jar -dbtype postgres -db dbusername:dbpasswordl@localhost/database_name -pkgroot org.mydomain.myprogram.database -source /home/jal/myproject/src/main/java -s pdi_meta -s source_mapping -s auth -s definition -s sectormodel

This connects to a PostgreSQL database with the specified username and passwords, loads all tables from the schema's pdi_meta, source_mapping, auth and sectormodel, then generates/updates all classes into the specified directory and package.

The directory and package are separate, so the final directory for the classes is formed by adding the source AND the package name.

The options supported are:

-dbDatabase connection string as username:password@hostname[:port]/databasename (required)
-dbtypeThe database type: postgres or oracle (required)
-sourceSpecifies the root of the source directory for both existing and generated sources
-pkgThe package name for the generated classes
-destroy-constructorsWhen set, this destroys all constructors in existing Java classes. It can be used to get rid of the silliness generated by the hibernate pojo tool
-ffrWhen set all field names are forcefully renamed to the name as decided by column name and prefix.
-frmWhen set all getter and setter methods in existing classes are renamed to whatever the property name is calculated to be
-nb, -no-bundlesDisable generation of .properties bundles
-no-baseclassDo not try to find base classes for new pojo's
-no-deserialPostgres 'serial' columns are actually just columns with a 'default' which retrieves a value from a generated sequence. By default the code will find this sequence and generate a SEQUENCE type of ID generator. Setting this option will cause the code to use the generated.IDENTITY method.
-no-onechar-booleanBy default, all columns found that are (var)char with a size of 1 and that contain <= 2 distinct values are generated as boolean with an appropriate @Type annotation. This option disables that.
-noi, -no -identifyableBy default all generated classes will implement IIdentifyable<T>. This disables generating that.
-s, -schemaAdds a schema to reverse engineer

Generated code

When the generator writes its output it will always make a backup copy of all files it overwrites, as ".old" files. In addition, when a .old file exists, the generator will always read that file as the source file when called again. This allows you to re-run the generator many times until the result is as desired; it will never re-read the code it has generated but instead the data that was present at the start.

Once you are happy with the result you should remove the .old files.

A .old file 0 bytes long is generated for all new files, so that the generator knows that those are not original either. Keep that in mind if you want to rename the .old files back.

Specifying exceptions and overriding names

By default the generator will try a bit to concoct reasonable names for classes and properties, but the quality is very dependent on whatever is used in the database. If you do not like the generated names you have two choices:

The GenHib.xml file gets generated/updated by the generator every time it is run. After the first run it will contain all possible options that can be set for all tables and columns with an "empty" value which means "use the default, Luke". You can simply edit this file to override the names and other things for classes. So a typical run would be:

Do not forget to add the .xml file to your VCS.