hibernatemaven-2hibernate-toolshbm2java

How to configure hbm2java and hbm2dao to add packagename to generated classes


I'm trying to configure hbm2java with maven to generate POJO classes and DAO objects. One of the issues I'm dealing with is package names aren't generated. I'm using the following pom for that:

<execution>
    <id>hbm2java</id>
    <phase>generate-sources</phase>
    <goals>
        <goal>hbm2java</goal>
    </goals>
    <inherited>false</inherited>
    <configuration>
        <components>
            <component>
                <name>hbm2java</name>
                <implementation>configuration</implementation>
            </component>
        </components>
        <componentProperties>
            <packagename>package.name</packagename>
            <configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
        </componentProperties>
    </configuration>
</execution>

Yet the generated code begins with the following:

// default package
// Generated 2010-05-17 13:11:51 by Hibernate Tools 3.2.2.GA

/**
 * Messages generated by hbm2java
 */
public class Messages  implements java.io.Serializable {

Is there a way to force maven to generate the package part as defined in packagename?

Update:

Here is my hibernate.cfg.xml, also automatically generated by hibernate-tools (hbm2cfgxml):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.timeout">1800</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/db</property>
        <property name="hibernate.connection.username">username</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <mapping resource="package/name/Messages.hbm.xml" />
    </session-factory>
</hibernate-configuration>

Solution

  • Just in case, here is a working configuration of the hibernate3-maven-plugin for a bottom-up approach:

      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        <version>2.2</version>
        <executions>
          <execution>
            <id>generate-xml-files</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>hbm2hbmxml</goal>
              <goal>hbm2cfgxml</goal>
            </goals>
          </execution>
          <execution>
            <id>generate-entities</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>hbm2java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <components>
            <component>
              <name>hbm2hbmxml</name>
              <implementation>jdbcconfiguration</implementation>
              <outputDirectory>target/classes</outputDirectory>
            </component>
            <component>
              <name>hbm2cfgxml</name>
              <implementation>jdbcconfiguration</implementation>
              <outputDirectory>target/classes</outputDirectory>
            </component>
            <component>
              <name>hbm2java</name>
              <implementation>configuration</implementation>
              <outputDirectory>target/generated-sources/hibernate3</outputDirectory>
            </component>
          </components>
          <componentProperties>
            <propertyfile>src/main/resources/database.properties</propertyfile>
            <jdk5>true</jdk5>
            <ejb3>false</ejb3>
            <packagename>com.mycompany.myapp</packagename>
            <format>true</format>
            <haltonerror>true</haltonerror>
          </componentProperties>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derby</artifactId>
            <version>10.5.3.0_1</version>
          </dependency>
        </dependencies>
      </plugin>
    

    And here is the content of my src/main/database.properties file:

    hibernate.connection.driver_class=org.apache.derby.jdbc.EmbeddedDriver
    hibernate.connection.url=jdbc:derby:./derbyDBs/EMPLDB
    hibernate.connection.username=APP
    hibernate.connection.password=APP
    hibernate.dialect=org.hibernate.dialect.DerbyDialect
    
    #workaround for http://opensource.atlassian.com/projects/hibernate/browse/HBX-1145
    hibernate.connection.autocommit=true 
    

    This setup:

    1. Generates *.hbm.xml in target/classes (with the package) during generate-resources.
    2. Generates a hibernate.cfg.xml in target/classes with entries for the mapping files.
    3. Generates entities from the mappings in target/generated-sources/hibernate3 (I recommend following the target/generated-sources/<tool> convention for generated sources so that they will get auto-detected by IDEs).

    Here is a the result of clean compile against a sample database with two tables:

    $ mvn clean compile
    ...
    $ tree target/
    target/
    ├── classes
    │   ├── com
    │   │   └── mycompany
    │   │       └── myapp
    │   │           ├── Department.class
    │   │           ├── Department.hbm.xml
    │   │           ├── Employee.class
    │   │           └── Employee.hbm.xml
    │   ├── database.properties
    │   └── hibernate.cfg.xml
    └── generated-sources
        └── hibernate3
            └── com
                └── mycompany
                    └── myapp
                        ├── Department.java
                        └── Employee.java