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 f开发者_JAVA百科ail 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?
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
To fix add DTO annotated classes to hibernate.cfg.xml in its mapping configuration. This fixed the problem and worked for me right away, generated complete schema of the database.
加载中,请稍侯......
精彩评论