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?
感謝