views:

21

answers:

1

This is the directory structure of the project (maven2 is used):

pom.xml
/src
  /main
    /java
      Abc.java
    /resources
      hibernate.cfg.xml
      database.properties
      /META-INF
        persistence.xml
  /test
    /java
      AbcTest.java
    /resources
      database.properties

This is the content of hibernate.cfg.xml:

<hibernate-configuration>
  <session-factory name="java:hibernate/SessionFactory">
    <property name="hibernate.archive.autodetection">true</property>
  </session-factory>
</hibernate-configuration>

This is what I have in persistence.xml:

<persistence>
  <persistence-unit name="abc">
    <jta-data-source>java:/abcDS</jta-data-source>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
    </properties>
  </persistence-unit>
</persistence>

And this is my Abc.java file:

import javax.persistence.*;
@Entity
public class Abc {
  @Id private int id;
}

After running mvn clean hibernate3:hbm2ddl I'm getting this output:

18:45:55,770  INFO org.hibernate.tool.hbm2ddl.SchemaExport - writing 
generated schema to file: ../target/hibernate3/sql/schema.ddl
18:45:55,770  INFO org.hibernate.tool.hbm2ddl.SchemaExport - schema export complete
[INFO] ————————————————————————————————————
[INFO] BUILD SUCCESSFUL

File schema.ddl is created, and it's empty. Why? And besides that, what is wrong in my configuration files? Since when I'm trying to run unit tests with PersistenceContext injections they fail with NullPointerException. Looks like there is some problem in the configuration. Can't find any manual online…

PS. There are two problems, I found them already. The first one is here (extra prefix should be removed):

<property name="archive.autodetection">true</property>

The second one is more interesting. When I'm running mvn hibernate3:hbm2ddl after compilation it works (because it has .class files to work with). Otherwise the schema is empty.. How to instruct this plugin to compile java classes beforehand?

+1  A: 

There are two problems, I found them already. The first one is here (extra prefix should be removed)

Indeed. So I'll skip this one.

How to instruct this plugin to compile java classes beforehand?

Not possible (but the other way around would be, i.e. running the plugin after compile, as we'll see).

The fact is that the Hibernate3 Maven Plugin, which predates annotations, has been initially designed to deal with hbm.xml mapping files. And that's why hibernate3:hbm2ddl invokes the execution of the lifecycle phase process-resources prior to executing itself.

When using annotation instead of XML files for the mappings, the goal would indeed have to run after the compile phase (the process-classes phase would be a natural candidate) but that's not the current behavior of hibernate3:hbm2ddl.

So you'll have to run compile before invoking the goal:

mvn compile hibernate3:hbm2ddl

The other option would be to bind the hibernate3:hbm2ddl on the build lifecycle, e.g. on process-classes:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        <version>2.2</version>
        <executions>
          <execution>
            <phase>process-classes</phase><!-- compile would also work -->
            <goals>
              <goal>hbm2ddl</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

And then just run process-classes to trigger the plugin:

mvn process-classes
Pascal Thivent