Поколение исходного кода Java знатока для в спящем режиме

Я занят, преобразовывая существующий проект от сборки Муравья до одного Знатока использования. Часть этой сборки включает использование быть в спящем режиме hbm2java инструмент для преобразования набора файлов .hbm.xml в Java. Вот отрывок скрипта Ant, используемого, чтобы сделать это:

<target name="dbcodegen" depends="cleangen" 
        description="Generate Java source from Hibernate XML">
  <hibernatetool destdir="${src.generated}">
    <configuration>   
      <fileset dir="${src.config}">
        <include name="**/*.hbm.xml"/>
      </fileset>
    </configuration>   
    <hbm2java jdk5="true"/>
  </hibernatetool>   
</target>

Я взглянул вокруг в Интернете, и некоторые люди, кажется, делают это (я думаю), использование Муравья в Знатоке и других с плагином Знатока. Я предпочел бы не смешивать Муравья и Знатока. Кто-либо может предложить способ сделать это так, чтобы все файлы .hbm.xml были взяты, и генерация кода происходит как часть фазы разработки генерации кода Знатока?

Спасибо!

Adam.

7
задан Lukas Eder 12 May 2014 в 09:37
поделиться

2 ответа

Ну, есть Maven Hibernate3 Plugin , если вы не хотите смешивать Ant и Maven (это хорошая идея, IMO). Он имеет цель hbm2java , которая по умолчанию привязана к фазе generate-sources . Обратитесь к веб-сайту Mojo для получения более подробной информации, но установка плагина может выглядеть примерно так:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>hibernate3-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
      <execution>
        <phase>generate-sources</phase>
        <goals>
          <goal>hbm2java</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <components>
        <component>
          <name>hbm2java</name>
          <implementation>configuration</implementation>
          <outputDirectory>target/generated-sources/hibernate3</outputDirectory>
        </component>
      </components>
      <componentProperties>
        <drop>true</drop>
        <jdk5>true</jdk5>
        <configurationfile>/src/main/resources/hibernate.cfg.xml</configurationfile>
      </componentProperties>
    </configuration>
  </plugin> 

РЕДАКТИРОВАТЬ: Плагин фактически ищет .hbm.xml в target / classes для создания исходных файлов Java. Итак, если вы поместите свои файлы сопоставления в src / main / resources , они будут скопированы в target / classes во время фазы process-resources , которая вызывается плагином, и все будет просто работать. Я только что протестировал это с помощью следующего образца проекта:

maven-hibernate3-testcase
|-- pom.xml
`-- src
    |-- main
    |   |-- java
    |   `-- resources
    |       |-- Person.hbm.xml
    |       `-- hibernate.cfg.xml
    `-- test
        `-- java

pom.xml почти пуст, он просто содержит конфигурацию плагина, показанную выше, и зависимость junit. hibernate.cfg.xml содержит:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="connection.url">jdbc:derby://localhost:1527/mydatabase</property>
    <property name="connection.username">app</property>
    <property name="connection.password">app</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.DerbyDialect</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">false</property>

    <!-- Mapping files -->
    <mapping resource="Person.hbm.xml" />
  </session-factory>
</hibernate-configuration>

И Person.hbm.xml выглядит следующим образом:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping
   PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="Person" table="person">
    <id name="id" type="int">
      <generator class="increment" />
    </id>

    <property name="name" column="cname" type="string" />
  </class>

</hibernate-mapping>

В этой конфигурации запуск mvn install генерирует Person.java , как показано ниже:

$ cat target/generated-sources/hibernate3/Person.java 
// default package
// Generated Dec 14, 2009 2:19:22 PM by Hibernate Tools 3.2.2.GA



/**
 * Person generated by hbm2java
 */
public class Person  implements java.io.Serializable {


     private int id;
     private String name;

    public Person() {
    }

    public Person(String name) {
       this.name = name;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }




}

Все работает, как описано.

14
ответ дан 6 December 2019 в 15:23
поделиться

Паскаль, еще раз спасибо за вашу помощь! Ваше решение работает хорошо.

Еще пара вещей, с которыми я столкнулся во время работы над этим. Первый связан с тем, что это довольно большой проект, и поэтому я разделил его на несколько модулей Maven, чтобы отразить исходную сборку ant с несколькими каталогами. Модуль, содержащий сгенерированные классы, на самом деле не выполняет никакого доступа к базе данных, поэтому файл hibernate.cfg.xml не должен и в этом случае не должен содержать никакой информации о подключении к БД. Я пробовал это, и он отлично работает с урезанной версией файла, предоставленного Паскалем, со всеми удаленными тегами свойств.

После этого сборка отлично работала из командной строки. Однако, как я ни старался, мне не удалось убедить другие модули выбрать сгенерированные классы при запуске из Eclipse. На данный момент решение, которое у меня есть, - добавить следующую строку в POM в разделе configuration / components / component:

<outputDirectory>/src/main/java</outputDirectory>

Это заставляет файлы создаваться в месте, которое eclipse может забрать их для других модулей. . Как только это будет сделано, вы должны выполнить сборку в командной строке, а затем запросить у Eclipse обновление содержимого исходного каталога, чтобы получить новые файлы. Пока я не знаю более чистого способа справиться с этим ....

Как только это будет сделано, вы должны выполнить сборку в командной строке, а затем запросить у Eclipse обновление содержимого исходного каталога, чтобы получить новые файлы. Пока я не знаю более чистого способа справиться с этим ....

Как только это будет сделано, вы должны выполнить сборку в командной строке, а затем запросить у Eclipse обновление содержимого исходного каталога, чтобы получить новые файлы. Пока я не знаю более чистого способа справиться с этим ....

0
ответ дан 6 December 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: