Есть ли способ получить задачу Hibernate hbm2ddl Ant для исключения определенных таблиц? - PullRequest
3 голосов
/ 26 января 2010

Я использую Hibernate для автоматической генерации своей базы данных для тестирования, и в моей схеме есть несколько таблиц, которые содержат статические данные, для импорта которых требуется очень много времени. В прошлом я использовал следующий код в своем файле сборки для создания базы данных (из файлов сопоставления):

<target name="schema-gen" depends="hibernate-gen">
    <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="project.classpath" />

    <schemaexport properties="resources/hibernate.properties" text="false" quiet="false" delimiter=";" output="schema.sql">
        <fileset dir="${build.doclets}">
            <include name="**/*.hbm.xml" />
            <exclude name="**/inert/*.hbm.xml" />
        </fileset>
    </schemaexport>
</target>

.hbm.xml файлы были созданы с использованием XDoclet. Я перехожу к использованию аннотаций Hibernate для отображения, поэтому я перехожу к hibernatetools для генерации схемы:

<target name="annotations-export" depends="hibernate-gen">
    <hibernatetool destdir="${basedir}">
        <annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties" />
        <classpath>
            <path refid="project.classpath" />
        </classpath>
        <hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
    </hibernatetool>
</target>

Я бы хотел сказать hbm2ddl об исключении классов из "инертного" пакета, как я это делал раньше со schemaexport. Кто-нибудь знает, есть ли способ сделать это?

Ответы [ 4 ]

2 голосов
/ 27 января 2010

Это должно работать:

<target name="annotations-export" depends="hibernate-gen">
    <hibernatetool destdir="${basedir}">
        <annotationconfiguration configurationfile="${basedir}/resources/hibernate.cfg.xml" propertyfile="${basedir}/resources/hibernate.properties">
            <fileset dir="${build.doclets}">
                <include name="**/*.class" />
                <exclude name="**/inert/*.class" />
            </fileset>
        </annotationconfiguration>
        <classpath>
            <path refid="project.classpath" />
        </classpath>
        <hbm2ddl drop="true" create="true" export="true" outputfilename="schema.sql" delimiter=";" format="true" />
    </hibernatetool>
</target>
1 голос
/ 28 января 2010

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

0 голосов
/ 22 июля 2015

Если у вас возникла такая ситуация, и вы не хотите, чтобы Hibernate также обновлял данные в таблицах, вы можете заменить:

<class name="FooClass" table="FOO_TABLE"></class>

с

<class name="Foo" subselect="select * from FOO_TABLE">
  <synchronize table="FOO_TABLE">
</class>

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

subselect (необязательно): отображает неизменяемый и доступный только для чтения объект на Подвыбор базы данных.

Я обнаружил это, посмотрев на функцию Table.isPhysicalTable. Вы также можете изучить использование AbstractUnionTables, что является другим исключением.

Я случайно хочу неизменных объектов.

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

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

0 голосов
/ 26 января 2010

вы пробовали атрибут update для тега hbmddl ?

<hbm2ddl update="true" ...

см. здесь для деталей

это должно работать

...