Domanda

Io occupato la conversione di un progetto esistente da una build Ant per uno utilizzando Maven. Parte di questa build include l'utilizzo lo strumento di sospensione hbm2java per convertire un insieme di file .hbm.xml in Java. Ecco un frammento dello script Ant utilizzato per fare questo:

<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>

Ho dato un'occhiata in giro su internet e alcune persone sembrano fare questo (credo) usando Ant all'interno di Maven e altri con il plugin Maven. Preferirei evitare di mescolare Ant e Maven. Qualcuno può suggerire un modo per fare questo in modo che tutti i file .hbm.xml sono raccolti e la generazione del codice avviene come parte della fase di costruzione di generazione del codice Maven?

Grazie!

Adam.

È stato utile?

Soluzione

Bene, c'è il Maven Hibernate3 Plugin se non si vuole mescolare Ant e Maven (che è una buona idea qui IMO). Ha un hbm2java obiettivo che è vincolato da imposterà la fase generate-sources. Fare riferimento al sito web del Mojo per maggiori dettagli, ma la messa a punto della potenza plug-in si presenta come qualcosa di simile a questo:

  <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> 

Modifica Il plugin in realtà cerca .hbm.xml in target/classes per generare i file sorgente Java. Quindi, se si mette i file di mapping in src/main/resources, avranno copiato in target/classes durante la fase process-resources che viene richiamato dal plugin e le cose solo di lavoro. Ho appena provato questo con il seguente progetto di esempio:

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

Il pom.xml è quasi vuota, contiene solo la configurazione plug visto sopra ed una dipendenza JUnit. Il hibernate.cfg.xml contiene:

<?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>

E Person.hbm.xml appare come segue:

<?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>

Con questa configurazione, l'esecuzione mvn install genera Person.java come illustrato di seguito:

$ 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;
    }




}

Tutto funziona come descritto.

Altri suggerimenti

Pascal, grazie ancora per il vostro aiuto! La soluzione funziona bene.

Un paio di altre cose che ho incontrato mentre si lavora su questo. La prima riguarda il fatto che questo è un abbastanza grande progetto e così ho diviso in più moduli Maven per rispecchiare l'originale formica costruzione multi-directory. Il modulo che contiene le classi generate in realtà non fa alcun accesso al database e quindi il file hibernate.cfg.xml non è necessario, e in questo caso non dovrebbe contenere tutte le informazioni di connessione DB. Ho provato questo fuori e funziona bene con una versione ridotta del file fornito da Pascal, con tutte le proprietà tag rimossi.

Con questo in luogo, la build ha funzionato bene dalla riga di comando. Tuttavia, Per quanto mi sforzassi, non riuscivo a persuadere gli altri moduli per raccogliere le classi generate quando viene eseguito da Eclipse. Per il momento, la soluzione che ho a questo è di aggiungere la seguente riga nel POM in Configurazione / componenti / Component:

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

In questo modo i file da generare in un luogo che eclissi li può pick up per gli altri moduli. Una volta fatto questo si deve fare una build sulla riga di comando e quindi richiedere che Eclipse aggiornare il contenuto della directory di origine per raccogliere i nuovi file. Per il momento, non so di un modo più pulito per gestire questa situazione ....

Se avete bisogno di includere * .hbm.xml sulla compilazione fase; modificare il pom.xml e aggiungere il codice seguente:

<build>
                <resources>
            <resource>
                <directory>source/com/qfund/orm/</directory>
                <targetPath>com/qfund/orm/</targetPath>
                <includes>
                    <include>*.hbm.xml</include>
                </includes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/java/</directory>
                <includes>
                    <include>*.xml</include>
                    <include>*.xsd</include>
                    <include>*.xslt</include>
                    <include>*.properties</include>
                </includes>
            </testResource>
        </testResources>
</build>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top