2008-11-18 4 views
40

Я использую JPA (реализация Hibernate), чтобы аннотировать классы сущностей, которые сохраняются в реляционной базе данных (MySQL или SQL Server). Есть ли простой способ автоматического создания схемы базы данных (скриптов создания таблиц) из аннотированных классов?Автоматическая генерация схемы данных из классов аннотированных сущностей JPA

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

+0

Ознакомьтесь с http://stackoverflow.com/questions/779479/reverse-engineer-ddl-from-jpa-entities – 2009-05-15 19:58:20

ответ

13

Вы можете использовать hbm2ddl из Hibernate. Документы: here.

+9

Он спросил о создании схем исключительно из аннотированных классов. Моя команда хочет сделать то же самое. Я считаю, что hbm2dll работает только с файлами сопоставления .hbm.xml, которые моя команда не хочет использовать. Я тоже не думаю, что ОП. – Omniwombat 2009-07-17 19:32:32

+1

В соответствии с «Удержание Java-сдерживания с помощью Hibernate» да, вы можете с hbm2ddl: «Необходимое условие в Hibernate для автоматической генерации SQL DDL всегда является определением метаданных отображения Hibernate, либо в файлах сопоставления XML, либо в аннотациях исходного кода Java». – dendini 2013-05-27 15:33:50

9

В качестве примечания: Документация для создания схем базы данных с использованием EclipseLink JPA может быть найдена here.

+0

Спасибо за это. Мой вопрос был ответ на первый хит Google благодаря вам. – AlanObject 2011-11-25 17:39:06

13

Сформировать создавать и удалять скрипт для данных JPA сущностей

Мы используем этот код, чтобы генерировать капли и создавать операторы: Просто построить этот класс со всеми классами сущностей и вызвать создание/dropTableScript.

При необходимости вы можете вместо этого использовать имя persitence.xml и persitance. Просто скажите что-нибудь , и я также отправлю код.

import java.util.Collection; 
import java.util.Properties; 

import org.hibernate.cfg.AnnotationConfiguration; 
import org.hibernate.dialect.Dialect; 
import org.hibernate.ejb.Ejb3Configuration; 

/** 
* SQL Creator for Tables according to JPA/Hibernate annotations. 
* 
* Use: 
* 
* {@link #createTablesScript()} To create the table creationg script 
* 
* {@link #dropTablesScript()} to create the table destruction script 
* 
*/ 
public class SqlTableCreator { 

    private final AnnotationConfiguration hibernateConfiguration; 
    private final Properties dialectProps; 

    public SqlTableCreator(final Collection<Class<?>> entities) { 

     final Ejb3Configuration ejb3Configuration = new Ejb3Configuration(); 
     for (final Class<?> entity : entities) { 
      ejb3Configuration.addAnnotatedClass(entity); 
     } 

     dialectProps = new Properties(); 
     dialectProps.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect"); 

     hibernateConfiguration = ejb3Configuration.getHibernateConfiguration(); 
    } 

    /** 
    * Create the SQL script to create all tables. 
    * 
    * @return A {@link String} representing the SQL script. 
    */ 
    public String createTablesScript() { 
     final StringBuilder script = new StringBuilder(); 

     final String[] creationScript = hibernateConfiguration.generateSchemaCreationScript(Dialect 
       .getDialect(dialectProps)); 
     for (final String string : creationScript) { 
      script.append(string).append(";\n"); 
     } 
     script.append("\ngo\n\n"); 

     return script.toString(); 
    } 

    /** 
    * Create the SQL script to drop all tables. 
    * 
    * @return A {@link String} representing the SQL script. 
    */ 
    public String dropTablesScript() { 
     final StringBuilder script = new StringBuilder(); 

     final String[] creationScript = hibernateConfiguration.generateDropSchemaScript(Dialect 
       .getDialect(dialectProps)); 
     for (final String string : creationScript) { 
      script.append(string).append(";\n"); 
     } 
     script.append("\ngo\n\n"); 

     return script.toString(); 
    } 
} 
+0

Довольно приятное решение! Но использование непосредственно persistence.xml было бы намного более удобным для нас. Не могли бы вы отправить код с помощью persistence.xml? Заранее спасибо! – 2012-04-26 10:55:55

+0

Эта строка: public SqlTableCreator (final Collection> entity) должна быть окончательной. Коллекция объектов – r590 2017-01-25 00:24:19

2

Если вы предпочитаете настройки весной, то это должно быть полезно:

<!-- CONTAINER-MANAGED JPA Entity manager factory (No need for persistence.xml)--> 
    <bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/> 
    <!-- Fine Grained JPA properties Create-Drop Records --> 
    <property name="jpaProperties"> 
    <props> 
    <prop key="hibernate.hbm2ddl.auto">create</prop> 
    </props> 
    </property> 
    </bean> 
    <!-- The JPA vendor --> 
    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
    <!-- <property name="database" value="MySQL"/> --> 
    <property name="showSql" value="true"/> 
    <!-- <property name="generateDdl" value="true"/> --> 
    <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>  
    </bean> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf" /> 
    </bean> 
2

Вы можете использовать Maven плагин для достижения этой цели.

 <plugin> 
      <!-- run command "mvn hibernate3:hbm2ddl" to generate DLL --> 
      <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> 
1
<property name="hibernate.hbm2ddl.auto" value="update"/> 

Добавьте приведенный выше код в persistence.xml в свойствах тега. «Обновление» создаст таблицу при первом запуске вашего кода, после чего обновит структуры таблиц только при любых изменениях в объекте домена.

7

Как Hibernate 4.3+ Сейчас реализует JPA 2.1 подходящий способ создания сценариев DDL, чтобы использовать следующий набор JPA 2.1 свойства:

<property name="javax.persistence.schema-generation.scripts.action" value="create"/> 
<property name="javax.persistence.schema-generation.create-source" value="metadata"/> 
<property name="javax.persistence.schema-generation.scripts.create-target" value="target/jpa/sql/create-schema.sql"/> 

Как будет работать во время выполнения, вы можете захотеть выполнить это Генерация DDL при сборке. Для Hibernate4 больше нет поддерживаемого официального плагина maven, возможно, потому что команда Hibernate переезжает в Gradle.

Во всяком случае, это JPA 2.1 подход к генерации скрипта программно:

import java.io.IOException; 
import java.util.Properties; 

import javax.persistence.Persistence; 

import org.hibernate.jpa.AvailableSettings; 

public class JpaSchemaExport { 

    public static void main(String[] args) throws IOException { 
     execute(args[0], args[1]); 
     System.exit(0); 
    } 

    public static void execute(String persistenceUnitName, String destination) { 
     System.out.println("Generating DDL create script to : " + destination); 

     final Properties persistenceProperties = new Properties(); 

     // XXX force persistence properties : remove database target 
     persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO, ""); 
     persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none"); 

     // XXX force persistence properties : define create script target from metadata to destination 
     // persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SCHEMAS, "true"); 
     persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_ACTION, "create"); 
     persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SOURCE, "metadata"); 
     persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_CREATE_TARGET, destination); 

     Persistence.generateSchema(persistenceUnitName, persistenceProperties); 
    } 

} 

Как вы можете видеть, что это очень просто!

Теперь вы можете использовать это в AntTask или MAVEN строить, как это (для Maven):

  <plugin> 
       <artifactId>maven-antrun-plugin</artifactId> 
       <version>1.7</version> 
       <executions> 
        <execution> 
         <id>generate-ddl-create</id> 
         <phase>process-classes</phase> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <configuration> 
          <target> 
           <!-- ANT Task definition --> 
           <java classname="com.orange.tools.jpa.JpaSchemaExport" 
            fork="true" failonerror="true"> 
            <arg value="${persistenceUnitName}" /> 
            <arg value="target/jpa/sql/schema-create.sql" /> 
            <!-- reference to the passed-in classpath reference --> 
            <classpath refid="maven.compile.classpath" /> 
           </java> 
          </target> 
         </configuration> 

        </execution> 
       </executions> 
      </plugin> 
1

С EclipseLink, вы должны добавить свойство:

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

Как здесь сказано : http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_ddl_generation.htm

Мой persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="appDB" transaction-type="JTA"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <jta-data-source>LocalMySQL</jta-data-source> 
     <class>entity.Us</class> 
     <class>entity.Btl</class> 
     <class>entity.Co</class> 
     <properties> 
      <property name="eclipselink.ddl-generation" value="create-tables"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
Смежные вопросы