почему мой schema.ddl пуст после hibernate3-maven-plugin? - PullRequest
3 голосов
/ 27 сентября 2010

Это структура каталогов проекта (используется maven2):

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

Это содержимое hibernate.cfg.xml:

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

Это то, что у меня есть в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>

А это мой Abc.java файл:

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

После запуска mvn clean hibernate3:hbm2ddl я получаю такой вывод:

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

Файл schema.ddl создан, и он пуст.Зачем?И кроме того, что не так в моих файлах конфигурации?Поскольку, когда я пытаюсь запустить модульные тесты с PersistenceContext инъекциями, они терпят неудачу с NullPointerException.Похоже, что есть некоторые проблемы в конфигурации.Не могу найти руководство онлайн ...

PS. Есть две проблемы, я их уже нашел.Первый здесь (лишний префикс должен быть удален):

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

Второй интереснее.Когда я запускаю mvn hibernate3:hbm2ddl после компиляции, он работает (потому что у него есть .class файлы для работы).В противном случае схема пуста. Как указать этому плагину заранее скомпилировать классы Java?

Ответы [ 2 ]

2 голосов
/ 28 сентября 2010

Есть две проблемы, я их уже нашел. Первый здесь (лишний префикс должен быть удален)

Действительно. Так что я пропущу это.

Как настроить этот плагин на предварительную компиляцию классов Java?

Невозможно (но, наоборот, можно будет запустить плагин после compile, как мы увидим).

Дело в том, что плагин Hibernate3 Maven, предшествующий аннотациям, изначально был разработан для работы с hbm.xml файлами картирования. И именно поэтому hibernate3:hbm2ddl вызывает выполнение этапа жизненного цикла process-resources перед выполнением самого себя .

При использовании аннотации вместо файлов XML для сопоставлений цель действительно должна выполняться после фазы compile (фаза process-classes будет естественным кандидатом), но это не текущий поведение hibernate3:hbm2ddl.

Так что вам нужно будет запустить compile, прежде чем вызывать цель:

mvn compile hibernate3:hbm2ddl

Другой вариант - привязать hibernate3:hbm2ddl к жизненному циклу сборки, например, на 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>

А затем просто запустите process-classes, чтобы запустить плагин:

mvn process-classes
0 голосов
/ 24 сентября 2015

Чтобы исправить, добавьте аннотированные классы DTO в hibernate.cfg.xml в его конфигурации отображения.Это решило проблему и сразу же сработало для меня, сгенерировало полную схему базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...