Melhor abordagem para compilação Java/Maven/JPA/Hibernato com o suporte ao fornecedor de banco de dados múltiplo?

StackOverflow https://stackoverflow.com/questions/2832001

Pergunta

Eu tenho um aplicativo corporativo que usa um único banco de dados, mas o aplicativo precisa suportar mysql, oráculo, e servidor SQL como opções de instalação.

Para tentar permanecer portátil Nós estamos usando Anotações JPA com Hibernate como implementação. Também temos uma instância de teste de teste de cada banco de dados em execução para desenvolvimento.

O aplicativo está se formando bem em Maven E eu brinquei com o hibernate3-maven-plugin e pode gerar automaticamente o DDL para um determinado dialeto de banco de dados.

Qual é a melhor maneira de abordar isso para que os desenvolvedores individuais possam testar facilmente nos três bancos de dados e nosso servidor de CI baseado em Hudson pode criar as coisas corretamente.

Mais especificamente:

  1. Eu pensei o hbm2ddl objetivo no apenas geraria um arquivo de esquema, Mas aparentemente ele se conecta a um banco de dados ao vivo e tenta criar o esquema. Existe uma maneira de ter isso Basta criar o arquivo de esquema Para cada dialeto de banco de dados sem conectando -se a um banco de dados?

  2. Se o hibernate3-maven-plugin Insiste em criar o esquema de banco de dados, existe uma maneira de retirar o banco de dados e recriá -lo antes de criar o esquema?

  3. Estou pensando que cada desenvolvedor (e a máquina de construção Hudson) deve ter seu próprio banco de dados separado em cada servidor de banco de dados. Isso é típico?

  4. Os desenvolvedores terão que executar o Maven três vezes ... uma vez para cada fornecedor de banco de dados? Em caso afirmativo, como mescla os resultados na máquina de construção?

  5. Existe um hbm2doc Objetivo dentro de Hibernate3-Maven-Plugin. Parece exagerado executar isso três vezes ... Eu tenho que acreditar que seria quase idêntico para cada banco de dados.

Foi útil?

Solução

1) Existe uma maneira de fazer isso apenas criar o arquivo de esquema para cada dialeto de banco de dados sem se conectar a um banco de dados?

Definir export para false. Algo assim:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>hibernate3-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <components>
      <component>
        <name>hbm2ddl</name>
        <implementation>annotationconfiguration</implementation>
      </component>
    </components>
    <componentProperties>
      <export>false</export><!-- do not export to the database -->
      <drop>true</drop>
      <configurationfile>src/main/resources/hibernate.cfg.xml</configurationfile>
      <outputfilename>my_schema.ddl</outputfilename>
    </componentProperties>
  </configuration>
</plugin>

2) Se o Hibernate3-Maven-Plug insistir em criar o esquema de banco de dados, existe uma maneira de retirar o banco de dados e recriá-lo antes de criar o esquema?

Veja acima. Mas apenas para o caso, para este conjunto update para true:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>hibernate3-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <components>
      <component>
        <name>hbm2ddl</name>
        <implementation>annotationconfiguration</implementation>
      </component>
    </components>
    <componentProperties>
      <export>true</export>
      <update>true</update><!-- update the schema -->
      <drop>true</drop>
      <configurationfile>src/main/resources/hibernate.cfg.xml</configurationfile>
      <outputfilename>my_schema.ddl</outputfilename>
    </componentProperties>
  </configuration>
  <dependencies>
    <dependency>
      <groupId>org.apache.derby</groupId>
      <artifactId>derbyclient</artifactId>
      <version>10.5.3.0_1</version>
    </dependency>
  </dependencies>
</plugin>

3) Estou pensando que cada desenvolvedor (e a máquina de construção Hudson) deve ter seu próprio banco de dados separado em cada servidor de banco de dados. Isso é típico?

Sim, e eu considero isso como uma prática recomendada (veja Use uma instância de banco de dados por desenvolvedor).

4) Os desenvolvedores terão que executar o Maven três vezes ... uma vez para cada fornecedor de banco de dados? Em caso afirmativo, como mescla os resultados na máquina de construção?

Sim, muito provável e eu usaria perfis para cada banco de dados. Na máquina de construção, eu faria construir um projeto de matriz.

5) Existe uma meta HBM2Doc no Hibernate3-Maven-Plugin. Parece exagerado executar isso três vezes ... Eu tenho que acreditar que seria quase idêntico para cada banco de dados.

Não estou acostumado a essa ferramenta, mas acho que pode haver uma pequena variação na saída (por exemplo, com a geração de chaves primárias). Eu geraria a documentação do esquema para cada banco de dados, mas apenas no momento da liberação (certamente não há necessidade de executar isso em cada compilação).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top