Глава 21. Руководство по набору инструментов
Оглавление-
21.1. Автоматическое генерирование схемы
- 21.1.1. Настройка схемы
- 21.1.2. Запуск инструмента
- 21.1.3. Свойства
- 21.1.4. Использование Ant
- 21.1.5. Инкрементные обновления схемы
- 21.1.6. Использование Ant для инкрементных обновлений схемы
- 21.1.7. Проверка схемы
- 21.1.8. Использование Ant для проверки схемы
Технология Roundtrip с Hibernate возможна с использованием набора плагинов Eclipse, инструментов командной строки и задач Ant.
В Hibernate Tools в настоящее время включены плагины для Eclipse IDE, а также задачи Ant для обратной разработки существующих баз данных:
- Редактор сопоставления (Mapping Editor): редактор файлов сопоставления XML-файлов Hibernate, поддерживающий автозаполнение и подсветку синтаксиса. Он также поддерживает семантическое автозаполнение имен классов и имён свойств/полей, что делает его более универсальным, чем обычный редактор XML.
- Консоль: консоль — это новый вид в Eclipse. В дополнение к древовидному обзору ваших конфигураций консоли вам также предоставляется интерактивное представление о ваших постоянных (persistent) классах и их отношениях. Консоль позволяет выполнять запросы HQL к вашей базе данных и просматривать результат непосредственно в Eclipse.
- Мастера разработки (Development Wizards): с инструментами Hibernate Eclipse предоставляется несколько мастеров разработки. Вы можете использовать мастер для быстрого создания файлов конфигурации Hibernate (cfg.xml) или перепроектировать существующую схему базы данных в исходные файлы POJO и файлы сопоставления Hibernate. Мастер обратного проектирования (reverse engineering) поддерживает настраиваемые шаблоны.
Дополнительную информацию см. в документации пакета Hibernate Tools.
Однако основной пакет Hibernate поставляется с интегрированным инструментом:
SchemaExport aka hbm2ddl
. Его можно использовать даже «изнутри» Hibernate.
21.1. Автоматическое генерирование схемы
DDL может быть сгенерирован из ваших файлов сопоставления с помощью утилиты Hibernate. Сгенерированная схема включает ограничения ссылочной целостности, первичные и внешние ключи для таблиц сущностей и коллекций. Таблицы и последовательности также создаются для генераторов отображаемых идентификаторов.
Вы должны указать SQL Dialect
с помощью свойства hibernate.dialect
при использовании этого инструмента, так как DDL вендорно высоко специфичен.
21.1.1. Настройка схемы
Многие элементы сопоставления Hibernate определяют необязательные атрибуты с именем
length, precision
и scale
. Вы можете задать длину, точность
и масштаб столбца с этими атрибутами.
<property name="zip" length="5" />
<property name="balance" precision="12" scale="2" />
Некоторые теги также принимают атрибут not-null
для создания ограничения NOT NULL
для столбцов таблицы и уникальный атрибут для создания ограничения UNIQUE
для столбцов таблицы.
<many-to-one name="bar" column="barId" not-null="true" />
<element column="serialNumber" type="long" not-null="true" unique="true" />
Атрибут unique-key
можно использовать для группировки столбцов в ограничение
по единственному уникальному ключу. Атрибут переопределяет имя любого ограничения
по единственному уникальному ключу.
<many-to-one name="org" column="orgId" unique-key="OrgEmployeeId" /> <property name="employeeId" unique-key="OrgEmployee" />
Атрибут index
указывает имя индекса, который будет создан с помощью сопоставленного
столбца или столбцов. Несколько столбцов можно сгруппировать в один и тот же индекс,
простым указанием одно и то же имени индекса.
<property name="lastName" index="CustName" /> <property name="firstName" index="CustName" />
Атрибут foreign-key
можно использовать для переопределения имени любого сгенерированного
ограничения внешнего ключа.
<many-to-one name="bar" column="barId" foreign-key="FKFooBar" />
Многие элементы отображения также принимают дочерний элемент <column>. Это особенно полезно для отображения типов нескольких столбцов:
<property name="name" type="my.customtypes.Name"/> <column name="last" not-null="true" index="bar_idx" length="30"/> <column name="first" not-null="true" index="bar_idx" length="20"/> <column name="initial"/> </property>
Атрибут default
позволяет указать значение по умолчанию для столбца. Перед сохранением
нового экземпляра сопоставленного класса необходимо присвоить такое же значение сопоставленному свойству.
<property name="credits" type="integer" insert="false"> <column name="credits" default="10"/> </property>
<version name="version" type="integer" insert="false"> <column name="version" default="0"/> </property>
Атрибут sql-type
позволяет пользователю переопределять сопоставление по умолчанию
типа Hibernate с типом данных SQL.
<property name="balance" type="float"> <column name="balance" sql-type="decimal(13,3)"/> </property>
Атрибут check
позволяет указать проверяющее ограничение.
<property name="foo" type="integer"> <column name="foo" check="foo > 10"/> </property>
<class name="Foo" table="foos" check="bar < 100.0"> ... <property name="bar" type="float"/> </class>
В следующей таблице приведены эти необязательные атрибуты.
Таблица 21.1. Резюме
Атрибуты | Значения | Интерпретация |
---|---|---|
length | число | длина столбца |
precision | число | десятичная точность столбца |
scale | число | десятичная шкала столбцов |
not-null | true|false |
указывает, что столбец должен быть ненулевым (non-null) |
unique | true|false |
указывает, что столбец должен иметь ограничение уникальности |
index | имя_индекса |
указывает имя (многоколоночного) индекса |
unique-key | имя_уникального_ключа |
задает имя уникального ограничения с несколькими столбцами |
foreign-key | имя_внешнего_ключа |
задает имя ограничения внешнего ключа, сгенерированного для ассоциации, для элемента
сопоставления <one-to-one>, <many-to-one>, <key> или <many-to-many>.
Обратите внимание, что inverse="true" стороны не будут учитываться
SchemaExport .
|
Элемент <comment> позволяет вам указывать комментарии для сгенерированной схемы.
<class name="Customer" table="CurCust"> <comment>Current customers only</comment> ... </class>
<property name="balance"> <column name="bal"> <comment>Balance in USD</comment> </column> </property>
Результатом будут инструкции комментарий к таблице
или комментарий к столбцу
в сгенерированном DDL где такое поддерживается.
21.1.2. Запуск инструмента
Средство SchemaExport
записывает сценарий DDL в стандартный поток вывода и/или выполняет
инструкции DDL.
В следующей таблице показаны параметры командной строки SchemaExport
java -cp
hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaExport
опции файлы_отображений
Таблица 21.2. SchemaExport
параметры командной строки
Параметр | Описание |
---|---|
--quiet |
не выводить скрипт в stdout |
--drop |
только дропнуть таблицы |
--create |
только создать таблицы |
--text |
не экспортировать в базу данных |
--output=my_schema.ddl |
вывести сценарий ddl в файл |
--naming=eg.MyNamingStrategy |
выбрать NamingStrategy |
--config=hibernate.cfg.xml |
прочитать конфигурацию Hibernate из файла XML |
--properties=hibernate.properties |
читать свойства базы данных из файла |
--format |
отформатировать сгенерированный SQL-код в скрипте |
--delimiter=; |
установить разделитель конца строки для скрипта |
Вы даже можете внедрить SchemaExport
в своё приложение:
Configuration cfg = ....; new SchemaExport(cfg).create(false, true);
21.1.3. Свойства
Свойства базы данных можно указать:
- как системные свойства с -D<свойство>
- в
hibernate.properties
- в именованных свойствах файла с
--properties
Необходимые свойства:
Таблица 21.3. Свойства подключения SchemaExport
Имя свойства | Описание |
---|---|
hibernate.connection.driver_class |
jdbc driver class |
hibernate.connection.url |
jdbc url |
hibernate.connection.username |
пользователь СУБД |
hibernate.connection.password |
пароль пользователя |
hibernate.dialect |
диалект |
21.1.4. Использование Ant
Вы можете вызвать SchemaExport
из скрипта сборки Ant:
<target name="schemaexport"> <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="class.path"/> <schemaexport properties="hibernate.properties" quiet="no" text="no" drop="no" delimiter=";" output="schema-export.sql"> <fileset dir="src"> <include name="**/*.hbm.xml"/> </fileset> </schemaexport> </target>
21.1.5. Инкрементные обновления схемы
Средство SchemaUpdate
обновит существующую схему с «инкрементальными» изменениями.
SchemaUpdate
зависит от API метаданных JDBC и, таким образом, не будет работать
со всеми драйверами JDBC.
java -cp
hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaUpdate
опции файлы_отображений
Таблица 21.4. SchemaUpdate
параметры командной строки
Опция | Описание |
---|---|
--quiet |
не выводить скрипт в stdout |
--text |
не экспортировать скрипт в базу данных |
--naming=eg.MyNamingStrategy |
выбрать NamingStrategy |
--properties=hibernate.properties |
читать свойства базы данных из файла |
--config=hibernate.cfg.xml |
указать файл .cfg.xml |
Вы можете встраивать SchemaUpdate
в ваше приложение:
Configuration cfg = ....; new SchemaUpdate(cfg).execute(false);
21.1.6. Использование Ant для инкрементных обновлений схемы
Вы можете вызвать SchemaUpdate
из сценария Ant:
<target name="schemaupdate"> <taskdef name="schemaupdate" classname="org.hibernate.tool.hbm2ddl.SchemaUpdateTask" classpathref="class.path"/> <schemaupdate properties="hibernate.properties" quiet="no"> <fileset dir="src"> <include name="**/*.hbm.xml"/> </fileset> </schemaupdate> </target>
21.1.7. Проверка схемы
Средство SchemaValidator
проверит, что существующая схема базы данных
«соответствует» вашим файлам отображений. SchemaValidator
сильно зависит
от API метаданных JDBC и, таким образом, не будет работать со всеми драйверами JDBC.
Этот инструмент чрезвычайно полезен для тестирования.
java -cp
hibernate_classpaths org.hibernate.tool.hbm2ddl.SchemaValidator
опции файлы_отображений
Таблица 21.5. SchemaUpdate
параметры командной строки
Опция | Описание |
---|---|
--naming=eg.MyNamingStrategy |
выбрать NamingStrategy |
--properties=hibernate.properties |
читать свойства базы данных из файла |
--config=hibernate.cfg.xml |
указать файл .cfg.xml |
Вы можете встраивать SchemaValidator
в ваше приложение:
Configuration cfg = ....; new SchemaValidator(cfg).validate();
21.1.8. Использование Ant для проверки схемы
Вы можете вызвать SchemaValidator
из скрипта Ant:
<target name="schemavalidate"> <taskdef name="schemavalidator" classname="org.hibernate.tool.hbm2ddl.SchemaValidatorTask" classpathref="class.path"/> <schemavalidator properties="hibernate.properties"> <fileset dir="src"> <include name="**/*.hbm.xml"/> </fileset> </schemavalidator> </target>