Question

What is the best (easiest) way to reverse-engineer POJOs from a database? I would like to generate probably 40 entity classes from tables, just to save a bunch of typing. I would like to use the Hibernate Tools toolset but all examples seem incomplete or contradictory - some reference using Ant tasks, some reference Maven plugins, and the Jboss site itself indicates that Hibernate Tools 4.x now seems to be an Eclipse plugin!

What is the "correct" way to do this, starting from scratch?

Was it helpful?

Solution

I actually wound up using an Ant task. If you have a situation where you need to reverse-engineer POJOs from a database, and you have no existing infrastructure in place, I believe the Ant method is best. I started with this excellent blog post and was able to cut and paste most of the code I needed. I found through experimentation that some additional JARs were needed and after some tweaking was able to generate the POJOs I needed in fairly short order.

This assumes that you know basic Java terminology and a little about Ant, and have both installed. Here are the steps.

You'll need to create two files (build.xml and hibernate.cfg.xml) and download some JARs. You may also need to download the Hibernate DTD files if you are behind a proxy or firewall (since Hibernate will try to go out and read the DTDs). That's it.

Create the following directories:

/myantproject
    /lib
    /src

In your "myantproject" directory create your build.xml file as follows:

<project name="antbuild" basedir="." default="gen_hibernate">

    <taskdef name="hibernatetool"
             classname="org.hibernate.tool.ant.HibernateToolTask">
        <classpath>
            <fileset dir="lib">
                <include name="**/*.jar"/>
            </fileset>
        </classpath>
    </taskdef>

    <target name="gen_hibernate"
            description="generate hibernate classes">
        <hibernatetool>

            <jdbcconfiguration
                    configurationfile="hibernate.cfg.xml"
                    packagename="com.mycompany.model"
                    detectmanytomany="true"
                    />
            <hbm2hbmxml destdir="src" />
            <hbm2java  destdir="src" />
        </hibernatetool>
    </target>

</project>

Also in the "myantproject" directory create your hibernate.cfg.xml file as follows:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"    >
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.ibm.as400.access.AS400JDBCDriver</property>
        <property name="hibernate.connection.url">jdbc:as400://myserver;libraries=MYLIB;dateformat=iso;timeformat=iso;prompt=false;naming=system;transaction isolation=none</property>
        <property name="hibernate.connection.username">myuser</property>
        <property name="hibernate.connection.password">mypassword</property>
        <property name="hibernate.dialect">org.hibernate.dialect.DB2400Dialect</property>
    </session-factory>
</hibernate-configuration>

If you are behind a firewall/proxy, you can download the DTD change the DTD reference in the file to this (make sure you edit it to point to your actual file location):

"file:///mypath/myantproject/lib/hibernate-configuration-3.0.dtd"

You can then download the DTD from the original URL and stick it in your "lib" directory.

Here are the JARs I wound up with. With these JARs, you should be able to run this Ant task and it will reverse-engineer all the tables in the database you have pointed to in "hibernate.cfg.xml".

cglib-nodep-2.2.3.jar
commons-collections-3.2.1.jar
commons-logging-1.1.1.jar
dom4j-1.6.1.jar
freemarker-2.3.8.jar
hibernate-annotations-3.5.0-Final.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-configuration-3.0.dtd
hibernate-core-3.3.1.GA.jar
hibernate-entitymanager-4.2.0.Final.jar
hibernate-tools-3.2.3.GA.jar
jt400-6.6.jar
jtidy-r938.jar
log4j-1.2.16.jar
slf4j-api-1.7.5.jar

These come from various sources - most either from apache.org or hibernate.org. You will need your database JDBC JAR from your database vendor (in this case an AS400 connector jar from IBM) to connect to the database. I also needed to download these DTDs since I was behind a firewall:

hibernate-mapping-3.0.dtd
hibernate-reverse-engineering-3.0.dtd

Good luck!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top