Глава 21. Руководство по набору инструментов

Оглавление
  1. 21.1. Автоматическое генерирование схемы
    1. 21.1.1. Настройка схемы
    2. 21.1.2. Запуск инструмента
    3. 21.1.3. Свойства
    4. 21.1.4. Использование Ant
    5. 21.1.5. Инкрементные обновления схемы
    6. 21.1.6. Использование Ant для инкрементных обновлений схемы
    7. 21.1.7. Проверка схемы
    8. 21.1.8. Использование Ant для проверки схемы

Технология Roundtrip с Hibernate возможна с использованием набора плагинов Eclipse, инструментов командной строки и задач Ant.

В Hibernate Tools в настоящее время включены плагины для Eclipse IDE, а также задачи Ant для обратной разработки существующих баз данных:

Дополнительную информацию см. в документации пакета 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. Свойства

Свойства базы данных можно указать:

Необходимые свойства:

Таблица 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>