Hibernate: сгенерируйте DDl для выходного файла, используя update = "true" и outputfilename в инструменте hbm2ddl - PullRequest
2 голосов
/ 08 октября 2011

Я пытаюсь экспортировать сгенерированный DDL в выходной файл вместо непосредственного отображения в командной строке для hbm2ddl.auto = update (с использованием автоматической генерации схемы).

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

Hibernate: hbm2ddl.auto = обновление в рабочем состоянии?

Я пытаюсь использовать это для разработки / тестирования баз данных.

Но проблема, с которой я здесь сталкиваюсь, заключается в том, что она не отправляет сгенерированный DDL в выходной файл, хотя я использую атрибут «outputfilename» в hbm2ddl
экспортер. (согласно этому http://docs.jboss.org/tools/2.1.0.Beta1/hibernatetools/html/ant.html)

Вот как выглядит мой build.xml. Я использую конфигурацию Jpa в Hibernate.

<taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask"     classpathref="classpath.hibernate" />

<target name="db_update_schema_sql" depends="db_config"
        description="create SQL script for updating schema">
    <hibernatetool destdir="${out.dir}">
       <jpaconfiguration persistenceunit="${persistence.unit.name}"/>
       <classpath path="${build.classes.dir}"/>             
       <hbm2ddl export="false" create="false" update="true" drop="false"     outputfilename="update.sql" delimiter=";" format="true"/>          
    </hibernatetool>
</target>

<target name="db_full_update" depends="db_config" description="Updates database">
    <antcall target="db_update_schema_sql" />
</target>

"update.sql" никогда не создается / обновляется, когда я устанавливаю update = "true". Он создает / обновляет только когда я использую либо create = "true" или drop = "true", либо оба.

Я немного углубился в это. Я нашел пару вопросов, связанных с этим в Hibernate Jira. Это все еще говорит, что это не решено. Для этого есть патч. Не уверен
использовал ли кто-нибудь этот патч.

https://hibernate.onjira.com/browse/HHH-1186 https://hibernate.onjira.com/browse/HBX-757

Я был бы очень признателен, если бы кто-нибудь, использующий эту функцию update = "true" для генерации ddl непосредственно в файл, объяснил мне, как он это сделал.

Кроме того, если вы используете для этого патч, дайте мне знать, как вы применили патч к существующему файлу Jar.

Спасибо, SM

1 Ответ

0 голосов
/ 06 августа 2014

Просто используйте соответствующие классы напрямую.

Connection connection = DriverManager.getConnection( dbUrl, dbUsername, dbPassword );
connection.setSchema (dbSchema);
Dialect dialect = ...; // eg, new MySQL5InnoDBDialect();
DatabaseMetadata metadata = new DatabaseMetadata( connection, dialect, null );

Configuration cfg = new Configuration();
cfg.addAnnotatedClass(...); // or read from xml
cfg.buildMappings();
List<SchemaUpdateScript> updateScritps = cfg.generateSchemaUpdateScriptList( dialect, metadata );

for ( SchemaUpdateScript script : updateScritps ) 
{
    String formatted = FormatStyle.DDL.getFormatter().format (script.getScript());

    // Replace with writing to file:
    System.out.println( formatted + ";" );
}

Программисты должны программировать, а не бить себя по голове XML.

Также проверьте исходный код org.hibernate.tool.hbm2ddl.SchemaUpdate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...