Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
583 views
in Technique[技术] by (71.8m points)

hibernate - 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>
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...