Hibernate union-subclass (таблица на конкретный класс) генератор отображения "increment" очень медленный? - PullRequest
0 голосов
/ 28 сентября 2011

Мой hbm-файл Hibernate выглядит примерно так с MySQL DB:

<hibernate-mapping>
<class name="com.company.common.bo.position.Parent" table="Parents"
    abstract="true">
    <id name="id">
        <generator class="increment" />
    </id>
    <property name="date" not-null="true" />
    <property name="milliseconds" not-null="true" />
    <property name="shares">
        <column name="shares" precision="19" scale="6" not-null="true" />
    </property>
    <many-to-one name="ticker" column="tickerID" not-null="true" index="_tickerID_date_milliseconds_idx" />
    <many-to-one name="auditTrail" column="auditTrailID"
        not-null="false" cascade="save-update" lazy="false" fetch="select" />

    <union-subclass name="com.company.common.bo.position.SubclassA"
        table="SubclassAs">
        <many-to-one name="account" column="accountID" not-null="true" foreign-key="SubclassA_accountID_fk" />
        <many-to-one name="portfolio">
            <column name="portfolioID" not-null="true"/>
        </many-to-one>
        <many-to-one name="individualTrade">
            <column name="individualTradeID" not-null="false"/>
        </many-to-one>  
        <many-to-one name="positionTransfer" column="positionTransferID"
                cascade="save-update" not-null="false"/>
    </union-subclass>

    <union-subclass
            name="com.company.common.bo.position.SubclassB" table="SubclassBs">
        <many-to-one name="individualTrade">
            <column name="individualTradeID" not-null="false" />
        </many-to-one>  
        <many-to-one name="account" column="accountID" not-null="true" foreign-key="SubclassBs_accountID_fk"/>
        <many-to-one name="internalExecution" column="executionID"
                cascade="save-update" not-null="false" />
    </union-subclass>       

    <union-subclass name="com.company.common.bo.position.SubclassC"
        table="SubclassCs">
    </union-subclass>
</class>

Так что в основном у меня есть абстрактный класс Parent и 3 подкласса (SubclassA, B, C), которыерасширить это.В базе данных есть 3 таблицы (для 3 подклассов).Генератор идентификатора является «приращением», потому что отображение подклассов объединения не позволяет мне использовать native.Похоже, с приращением идентификатор уникален среди 3 таблиц.Когда я смотрю на hibernate sql, он в основном находит максимальный идентификатор из всех 3 таблиц и использует его в качестве следующего идентификатора.Но запрос, который он использует, кажется очень неэффективным.Вот что я делаю:

select max(ids_.id) from ( select id from SubclassAs union select id from SubclassBs union select id from SubclassCs ) ids_ 

. Для запуска требуется более 12 секунд.Каждая из этих таблиц содержит более миллиона записей.Он объединяет все идентификаторы вместе, а затем выбирает максимальное значение из этого.

Если я делаю что-то вроде этого:

select max(ids_.id) from ( select max(id) as id from SubclassAs union select max(id) as id from SubclassBs union select max(id) as id from SubclassCs ) ids_

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

Есть ли способ сказать hibernate сделать это вместо этого, или есть лучший способ использования генератораза ID через эти 3 таблицы?

Спасибо

1 Ответ

0 голосов
/ 28 сентября 2011

Если increment не удовлетворяет вас, вы можете использовать другую стратегию генератора, и, поскольку MySQL не поддерживает последовательности, следующий подходящий вариант - стратегия hilo .

...