How to map oracle timestamp to appropriate java type in hibernate?

Jacob Schoen picture Jacob Schoen · Mar 18, 2010 · Viewed 13.2k times · Source

I am new to hibernate and I am stumped. In my database I have tables that have a columns of TIMESTAMP(6). I am using Netbeans 6.5.1 and when I generate the hibernate.reveng.xml, hbm.xml files, and pojo files it sets the columns to be of type Serializable. This is not what I expected, nor what I want them to be.

I found this post on the hibernate forums saying to place:

<sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />

in the hibernate.reveng.xml file.

In Netbeans you are not able to generate the mappings from this file (it creates a new one every time) and it does not seem to have the ability to re-generate them from the file either (at least according to this it is slated to be available in version 7).

So I am trying to figure out what to do. I am more inclined to believe I am doing something wrong since I am new to this, and it seems like it would be a common problem for others.

  • So what am I doing wrong?
  • If I am not doing anything wrong, how do I work around this?

I am using Netbeans 6.5, Oracle 10G, and I believe Hibernate 3 (it came with my netbeans).

Edit: Meant to say I found this stackoverflow question, but it is really a different problem.

UPDATE: The oracle jdbc driver I was using (ojdbc14.jar) is 9.0.2.0.0 I have now also tried:

  • ojdbc14.jar version 10.2.0.4.0
  • ojdbc6.jar version 11.2.0.1.0

Answer

Jacob Schoen picture Jacob Schoen · Mar 19, 2010

I found a work around for this problem. The issue itself seems to revolve around the fact that Netbeans 6.5 (and I later versions up to this point) do not allow you to reverse engineer a database from an existing hibernate.reveng.xml file. This is slated to be available in version 7.

The work around I found is to create an ant task to recreate the hbm.xml and pojo java files. I currently have this hooked to happen when I do a clean and build, but I am going to try to find a way to to have it completely separate, since it will only need to be ran when the database schema changes.

To accomplish this when you do a clean and build though you need to edit your build.xml file.

The first part is the libraries you will need. So add:

<path id="toolslib">
        <path location="lib/hibernate-support/hibernate-tools.jar" />
        <path location="lib/hibernate-support/hibernate3.jar" />
        <path location="lib/hibernate-support/freemarker.jar" />
        <path location="lib/hibernate-support/jtidy-r938.jar" />
        <path location="lib/ojdbc14.jar" />
</path>

You should already have the hibernate-tools.jar, hibernate3.jar, and ojdbc14.jar files on you machine. So just change the path to them. The freemaker.jar and jtidy-r938.jar will need to be downloaded, as I did not have those.

Below this in the build.xml you will need to add:

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

The last section you will need is the set to run in the post-clean section:

<target name="-post-clean">
        <delete dir="src/*Put the foler where your pojos and hbm.xml files are located*"/>
        <hibernatetool>
            <jdbcconfiguration
                configurationfile="src\hibernate.cfg.xml"
                packagename="*the package where you want them recreated*"
                revengfile="src\hibernate.reveng.xml"
                detectmanytomany="true"
            />
            <hbm2hbmxml destdir="src" />
            <hbm2java  destdir="src" />
        </hibernatetool>
</target>
  • The delete portion will delete the existing hbm and pojo files, before they are re-created.
  • The configurationfile points to your main configuration file.
  • The package name is the dot separated package you want them created in (com.stackoverflow.pojo for example).
  • The revengfile is the reverse engineering xml file to use when creating the hbm and pojo files.
  • The hbm2hbmxml will create the hbm.xml files of your tables.
  • The hbm2java will create the java pojo files of your tables.

Now to get the Oracle Timestamps to be something other than Serializable, edit the hibernate.reveng.xml file and add:

<type-mapping>
        <sql-type jdbc-type="OTHER" hibernate-type="java.sql.Timestamp" />
</type-mapping>

just after the schema-selection tag.

So a clean and build and the timestamps will not be java.sql.Timestamp instead of Serializable objects.

This is a long answer I know, but this should also work for any other changes that you would have to set in the hibernate.reveng.xml file (I think). I am no expert in hibernate, so your mileage may vary with this.

UPDATE: So after some googling I found this site about custom ant tasks in Netbeans. So I simply changed the name of the target to be gen-dao and now it does not run every time I do a clean and build, just when I specifically invoke it.