2011-09-28 58 views
0

我的Hibernate HBM文件看起來是這樣的一個MySQL數據庫:Hibernate union-subclass(表每個具體類的表)生成器的「增量」非常慢?

<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> 

所以基本上我有一個抽象類,父和子類3(SubclassA,B,C)擴展它。在數據庫中有3個表格(3個子類別)。 id生成器是「增量」,因爲聯合子類映射不允許我使用native。所以它看起來像增量一樣,這個ID在3個表中是唯一的。當我查看hibernate sql時,它基本上從所有3個表中找到最大ID,並將其用作下一個ID。但是它使用的查詢效率很低。這是我看到它在做:

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

這需要超過12秒的運行。每個表格都有超過一百萬條記錄。它將每個ID都結合在一起,然後選擇最大值。

如果我做這樣的事情:

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_ 

它快得多,小於一毫秒,因爲內部工會只得到每個表最大,然後我只選擇最高出者3條記錄。

有沒有辦法讓hibernate做到這一點,或者是否有更好的方式使用生成器來生成這3個表中的ID?

感謝

回答

0

如果increment不能滿足你,你可以使用一些其他發電機組的策略,因爲MySQL不支持序列,下一個合適的選擇是一個hilo strategy