5

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>
mmm
  • 1,277
  • 5
  • 18
  • 34
  • What does your hibernate.cfg.xml file look like. Is it possible that the file is overriding the setting? Also, note that the config file you have specified is misspelled, hibernane.cfg.xml. I'm not sure if thats intentional or not. – tschaible May 17 '10 at 11:46
  • The misspelling arised while copy-pasting and formatting the code for StackOverflow - but thanks. I added my hibernate.cfg.xml. – mmm May 17 '10 at 12:42

2 Answers2

3

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
Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • Nice, simpler than mine :). Do you have a clue why the hbm.xml files don't get copied automatically to target/classes from generated-sources/hibernate3/generated-mappings before generate-sources goal gets executed? I see you also force maven to put those files directly in the target/classes folder. Isn't there a way to configure that somehow? – mmm May 18 '10 at 15:18
  • @mmm I don't know why they aren't (the plugin should *add* this directory as resource directory to the pom). It should be possible to use the Build Helper plugin (see the [Usage](http://mojo.codehaus.org/build-helper-maven-plugin/usage.html) page) for that though. But this would be more verbose and I don't see real benefits. So, since the solution I'm using just works, I never tried to do it another way. – Pascal Thivent May 18 '10 at 15:42
  • Even though i set the phase as generate-resources this goal never gets executed for. is there any wrong i am doing? – Abdus Samad Nov 07 '22 at 22:13
0

Ok, I figured it out. I put the answer here.

Community
  • 1
  • 1
mmm
  • 1,277
  • 5
  • 18
  • 34