Использование последовательности генератора идентификаторов или таблицы HiLow на основе базы данных

Мы используем Hibernate 3.2 и не можем выполнить обновление из-за зависимости от других библиотек, используемых в устаревших приложениях. В настоящее время в файле сопоставления гибернации для таблицы используется «родной» генератор идентификаторов. В свою очередь, спящий режим использует «последовательность» для Oracle и «столбец Auto_Increment» для MySQL. Поскольку приложение генерирует множество идентификаторов, поэтому в случае Oracle для выборки следующей последовательности множество запросов проходит между базой данных и приложением, влияя на производительность. Мы хотели бы использовать HiLow для Oracle и хотели бы продолжать использовать «столбец Auto_Increment» для MySQL.

Вопрос в том, как определить файл сопоставления, чтобы Hibernate использовал HiLow, если базовая база данных - Oracle, и «столбец Auto_Increment», если базовая база данных - MySQL? Если мы не можем добиться этого с помощью файла сопоставления, какой класс мы должны переопределить?


person Stauz    schedule 15.10.2014    source источник


Ответы (2)


Hibernate Core предоставляет различные встроенные классы генератора простых первичных ключей, например:

1) hilo ==> org.hibernate.id.TableHiloGenerator

2) инкремент ==> org.hibernate.id.IncrementGenerator и т. Д.

Например, допустим, у вас есть класс Customer, как показано на рисунке:

Customer.java

package org.myapps;

public class Customer {
    private long cid; // your primary key property
    ...
    // setters and getters
}

Теперь вы можете указать генератору идентификаторов гибернации для генерации идентификаторов с использованием алгоритма hilo как: Customer.hbm.xml

<hibernate-mapping>
    <class name="org.myapps.Customer" table="CUSTOMER">
        <id name="cid" type="int">
            <column name="CID" />
            <generator class="hilo">
                <param name="table">hi_value</param>
                <param name="column">next_value</param>
                <param name="max_lo">1000</param>
            </generator>
        </id>
    ....
</hibernate-mapping>

И использовать генератор приращения

<hibernate-mapping>
    <class name="org.myapps.Customer" table="CUSTOMER">
        <id name="cid" type="int">
            <column name="CID" />
            <generator class="increment" />
        </id>
    ....
</hibernate-mapping>

Теперь, если ваш вопрос заключается в том, как переключаться между этими двумя типами генерации в зависимости от вашей базовой базы данных (Oracle или MySQL), то, на мой взгляд, вам необходимо определить два файла конфигурации гибернации:

1) oracle_hibernate.cfg.xml - для Oracle

2) mysql_hibernate.cfg.xml - для MySQL

вместе с двумя версиями файлов сопоставления гибернации для каждой сущности:

один для Oracle (oracle_Customer.hbm.xml) с использованием генератора hilo и

один для MySQL (mysql_Customer.hbm.xml) с использованием генератора приращения

и сопоставьте эти файлы сопоставления с их соответствующим файлом xxx.cfg.xml.

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

ПРИМЕЧАНИЕ. Это то, что я придумал, однако здесь считается цитирование экспертов, и вам следует проконсультироваться с кем-то более опытным.

person Amitesh Rai    schedule 15.10.2014

Мы расширили Oracle10gDialect и переопределили метод "supportsSequences ()" для возврата false. Таким образом, файл сопоставления продолжал использовать собственный генератор идентификаторов, и, поскольку настроенный диалект Oracle возвращает false для поддерживающих последовательностей, Hibernate использует «TableHiLoGenerator».

person Stauz    schedule 16.10.2014