Обратный инженер DDL из объектов JPA
Я играю с некоторыми материалами JPA, меняя сопоставления, чтобы увидеть, как они должны быть и т.д. Это основное экспериментирование. Однако я не могу найти инструмент, который просто будет читать мои объекты, а затем сгенерирует схему таблицы для меня. Я пытался найти что-то подобное в инструментах JBoss, но нада. Интеграция Eclipse будет огромным плюсом, но я возьму инструмент командной строки или задачу ant.
Любые идеи?
Ответы
Ответ 1
Я не думаю, что есть универсальный способ сделать это с JPA, вы должны напрямую использовать базовую реализацию JPA для достижения этого.
Для Hibernate существует несколько возможностей:
- Использовать метод duffymo, опубликованный ранее, что позволяет Hibernate автоматически обновлять схему базы данных.
- Если вы этого не хотите, вы можете использовать инструмент hbm2ddl из Hibernate Tools (обратите внимание: ссылка отстой, но, видимо, их домашняя страница немного нарушена прямо сейчас). Вы можете использовать это для автоматического создания сценариев создания базы данных из своих объектов JPA; есть также плагины для Maven и Ant, которые автоматически вызывают
hbm2ddl
.
Для EclipseLink (ранее Oracle TopLink, JPA 2.0 RI) см. Использование расширений EclipseLink JPA для генерации схемы, В принципе он очень похож на Hibernate, хотя на первый взгляд я не вижу ничего, что можно было бы использовать в качестве автономной утилиты для создания DB script.
Другие реализации JPA (BEA/Oracle Kodo, Apache OpenJPA), вероятно, имеют свои собственные конкретные способы достижения этого.
Ответ 2
Попробуйте добавить следующее к вашему persistence.xml
Для спящего режима:
Чтобы создать:
<property name="hibernate.hbm2ddl.auto" value="update"/>
Отбросить и создать:
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
Для Toplink:
Чтобы создать:
<property name="toplink.ddl-generation" value="create-tables"/>
Отбросить и создать:
<property name="toplink.ddl-generation" value="drop-and-create-tables"/>
Для EclipseLink:
Чтобы создать:
<property name="eclipselink.ddl-generation" value="create-tables"/>
Отбросить и создать:
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
Ответ 3
Когда я использую Hibernate, я просто добавляю его в свой файл конфигурации:
<property name="hbm2ddl.auto">update</property>
Заботится обо всем. Я не уверен, что эквивалент для JPA, но он так сильно повлиял на Hibernate, что я был бы удивлен, если бы вы не смогли найти что-то подобное.
Инструмент не требуется. Обычно я просто запускаю простой тест JUnit, и база данных создана для меня.
Ответ 4
Я использую класс Hibernate org.hibernate.tool.hbm2ddl.SchemaExport
, а этот небольшой метод -
создать схему в базе данных:
public static void rebuildSchema()
{
configuration = new Configuration();
configuration.configure();
new SchemaExport(configuration)
.setHaltOnError(true)
.execute(false, true, false, false);
}
чтобы создать DDL во внешнем файле, используйте этот вызов для execute
.
new SchemaExport(configuration)
.setHaltOnError(true)
.setOutputFile(outputFile)
.setImportFile("")
.setDelimiter(";")
.setFormat(true)
.execute(false, false, false, true);
Он считал плохую форму, чтобы установить "hibernate.hbm2ddl.auto" на "обновление", так как автоматическое изменение базы данных может нарушить ее. Для пояснения см. Hibernate hbm2ddl.auto возможные значения и что они делают?.
Ответ 5
Плагин 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>
Ответ 6
DataNucleus имеет свой собственный SchemaTool, способный генерировать схему для вас или генерируя необходимые инструкции DDL для вас, чтобы адаптировать и применять сам.
- Энди (DataNucleus)
Ответ 7
Добавление к списку Джеймса МакМэхона:
Для OpenJPA:
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
Ответ 8
Антонио Гонсалвес в своем блоге говорит об API для создания схемы.
В JPA 2.1 generateSchema был введен для этой цели.
Пример из блога:
public class Main {
public static void main(String[] args) {
Persistence.generateSchema("samplePU", null);
}
}