Как я могу создать ddl для моих объектов jpa из кода Java?
Вопрос
Я ищу способ создать ddl для моих аннотированных объектов jpa.Я предпочитаю для этого чистый Java-способ.
Если возможно, было бы неплохо также сгенерировать операторы удаления.
Решение
Экспорт данных из базы данных в формате sql
Использовать жидкая основа проект с открытым исходным кодом
LiquiBase — это независимая от базы данных библиотека с открытым исходным кодом (LGPL) для отслеживания, управления и применения изменений в базе данных.Он построен на простой предпосылке:Все изменения базы данных (структура и данные) сохраняются в описательном виде на основе XML и проверяются в системе контроля версий.
Создайте сценарий создания и удаления для заданных объектов JPA.
Мы используем этот код для генерации операторов drop и create:Просто создайте этот класс со всеми классами сущностей и вызовите create/dropTableScript.
При необходимости вместо этого вы можете использовать файл persitence.xml и имя единицы сохранения.Просто скажи что -нибудь, и я тоже публикую код.
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> 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(); } }
Другие советы
DataNucleus имеет SchemaTool, который можно вызвать из Java или из командной строки.Он делает то, что вам нужно
--Энди (DataNucleus)
В Hibernate есть встроенная поддержка для этого.Видеть org.hibernate.tool.hbm2ddl.SchemaExport.
OpenJPA тоже поддерживает это.OpenJPA картографический инструмент можно создать сценарий или создать файл ddl.ddl должен работать с другими реализациями JPA (хотя у каждого поставщика есть несколько особенностей).
Если вы используете OpenJPA в качестве поставщика сохраняемости, вы можете настроить OpenJPA для создания таблиц при первой необходимости, добавив свойство SynchronizeMappings в файл persistence.xml.
Пример :
<persistence-unit name="test">
<!--
. . .
-->
<properties>
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema"/>
</properties>
<!--
. . .
-->
</persistence-unit>
Вот объяснение того, как использовать класс Hibernate SchemaExport, чтобы делать именно то, что вы хотите.
http://jandrewthompson.blogspot.com/2009/10/how-to-generate-ddl-scripts-from.html
Надеюсь это поможет.