Есть ли способ получить задачу HBM2DD HBM2DL HIBERNATE, чтобы исключить определенные таблицы?
-
22-09-2019 - |
Вопрос
Я использую 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 оставлять классы в пакете «Инертный», как я раньше с SchemeAxport. Кто -нибудь знает, есть ли способ сделать это?
Решение 2
Решением, с которым я поступил, было создание отдельной конфигурации Hibernate с точно таковыми классами, которые я хотел отобразить, и использование ее для экспортной задачи вместо другой конфигурации Hibernate со всеми сопоставленными классами.
Другие советы
Это должно работать:
<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>
Вы пробовали Обновить атрибут на HBMDDL ярлык?
<hbm2ddl update="true" ...
видеть здесь для деталей
это должно работать
Если у вас есть эта ситуация, и вы не хотите, чтобы Hibernate обновил данные В таблицах тоже вы можете заменить:
<class name="FooClass" table="FOO_TABLE"></class>
с
<class name="Foo" subselect="select * from FOO_TABLE">
<synchronize table="FOO_TABLE">
</class>
Тогда инструмент экспорта схемы будет игнорировать его, но и какие -либо записывают. По крайней мере, это то, что предлагает документация.
Subseceect (необязательно): отображает неизменную и только чтение сущности в подбол базы данных.
Я обнаружил это, глядя на Table.isPhysicalTable
функция Вы также можете использовать AbstractUniontables, которые являются другим исключением.
Я случайно хочу неизменных объектов.
Мой пример использования заключается в том, что я хочу загрузить немного по -разному в форме неподвижных изданий некоторых управляемых объектов Hibernate без риска случайного изменения экспорта схемы. Таким образом, Subsect довольно хорошо подходит для этого.
К сожалению, это засоряет все ваши запросы с этим подэлектом, который база данных должен Уметь оптимизировать его, но люди имеют различные объемы доверия к оптимизации базы данных по уважительной причине.