2009-04-22 17 views
19

Je suis en train de jouer avec des trucs JPA, en changeant les mappages pour voir comment ils sont censés être, etc. C'est une expérimentation basique. Cependant, je ne peux pas trouver un outil qui va simplement lire mes entités et ensuite générer le schéma de la table pour moi. J'ai essayé de trouver quelque chose comme ça dans les outils de JBoss mais nada. L'intégration d'Eclipse sera un énorme plus mais je prendrai un outil de ligne de commande ou une tâche de fourmi.Reverse engineering DDL à partir des entités JPA

Des idées?

Répondre

8

Je ne pense pas qu'il y ait un moyen universel de le faire avec JPA, vous devez utiliser directement la mise en œuvre sous-jacente JPA pour y parvenir.

Pour Mise en veille prolongée, il y a plusieurs possibilités:

  • Utilisez la méthode duffymo posté plus tôt, qui fait Hibernate met automatiquement à jour le schéma de base de données.
  • Si vous ne le souhaitez pas, vous pouvez utiliser l'outil hbm2ddl de Hibernate Tools (note: lien craint, mais apparemment leur page d'accueil est un peu cassée en ce moment). Vous pouvez l'utiliser pour générer automatiquement des scripts de création de base de données à partir de vos entités JPA; il y a aussi des plugins pour Maven et Ant qui invoquent hbm2ddl automatiquement.

Pour EclipseLink (anciennement Oracle TopLink, l'Assemblée parlementaire paritaire 2.0 RI) voir Using EclipseLink JPA Extensions for Schema Generation. En principe, il est très similaire à Hibernate, bien qu'à première vue je ne vois rien qui puisse être utilisé comme un utilitaire autonome pour créer un script DB.

D'autres implémentations JPA (BEA/Oracle Kodo, Apache OpenJPA) ont probablement leurs propres méthodes spécifiques pour y parvenir.

6

Lorsque j'utilise Hibernate ajouter simplement à mon fichier de configuration:

 <property name="hbm2ddl.auto">update</property> 

prend soin de tout. Je ne suis pas sûr de ce que l'équivalent est pour JPA, mais il est tellement influencé par Hibernate que je serais surpris si vous ne pouviez pas trouver quelque chose de similaire.

Aucun outil nécessaire. D'habitude, je lance un simple test JUnit et la base de données est créée pour moi.

2

DataNucleus possède son propre SchemaTool capable de générer le schéma pour vous, ou de générer les instructions DDL requises pour que vous puissiez vous adapter et vous appliquer.

--Andy (DataNucleus)

16

Essayez d'ajouter ce qui suit à votre persévérance.xml

Pour Hibernate:

Pour créer:

<property name="hibernate.hbm2ddl.auto" value="update"/> 

Pour créer et laisser tomber:

<property name="hibernate.hbm2ddl.auto" value="create-drop"/> 

Pour Toplink:

Pour créer:

<property name="toplink.ddl-generation" value="create-tables"/> 

Pour supprimer et créer:

<property name="toplink.ddl-generation" value="drop-and-create-tables"/> 

Pour EclipseLink:

Pour créer:

<property name="eclipselink.ddl-generation" value="create-tables"/> 

Pour créer et laisser tomber:

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> 
2

Ajouter à la liste de James McMahon:

Pour OpenJPA:

<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/> 
4

J'utilise la classe de mise en veille prolongée org.hibernate.tool.hbm2ddl.SchemaExport et cette petite méthode pour

générer le schéma dans la base de données:

public static void rebuildSchema() 
{ 
    configuration = new Configuration(); 
    configuration.configure(); 

    new SchemaExport(configuration) 
     .setHaltOnError(true) 
     .execute(false, true, false, false); 
} 

pour créer le DDL dans un fichier externe, utilisez cet appel à execute.

 new SchemaExport(configuration) 
     .setHaltOnError(true) 
     .setOutputFile(outputFile) 
     .setImportFile("") 
     .setDelimiter(";") 
     .setFormat(true) 
     .execute(false, false, false, true); 

à « mettre à jour », car changer automatiquement la base de données de production, il est considéré comme une mauvaise forme pour régler « hibernate.hbm2ddl.auto » peut casser. Pour une explication, voir Hibernate hbm2ddl.auto possible values and what they do?.

4

Par plugin maven:

 <plugin> 
      <!-- run "mvn hibernate3:hbm2ddl" to generate a schema --> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>hibernate3-maven-plugin</artifactId> 
      <version>3.0</version> 
      <configuration> 
       <hibernatetool> 
        <classpath> 
         <path location="${project.build.directory}/classes" /> 
         <path location="${project.basedir}/src/main/resources/META-INF/" />            
        </classpath> 

        <jpaconfiguration persistenceunit="galleryPersistenceUnit" />      
        <hbm2ddl create="true" export="false" destdir="${project.basedir}/target" drop="true" outputfilename="mysql.sql" format="true" console="true"/> 
       </hibernatetool> 
      </configuration> 
     </plugin> 
0

Antonio Goncalves dit dans son blog sur les API pour générer le schéma.
Dans JPA 2.1 generateSchema méthode a été introduite à cette fin.

Exemple de blog:

public class Main { 
    public static void main(String[] args) { 
     Persistence.generateSchema("samplePU", null); 
    } 
}