首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate联合-子类(每个具体类一个表)映射生成器的“增量”很慢吗?

Hibernate联合-子类(每个具体类一个表)映射生成器的“增量”很慢吗?
EN

Stack Overflow用户
提问于 2011-09-28 22:00:02
回答 1查看 4.3K关注 0票数 1

我的Hibernate hbm文件与mysql DB类似:

代码语言:javascript
复制
<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生成器是“增量”的,因为联合子类映射不允许我使用原生。所以看起来有了增量,ID在3个表中是唯一的。当我查看hibernate sql时,它基本上从所有3个表中找到最大ID,并将其用作下一个ID,但它使用的查询似乎非常低效。这就是我所看到的:

代码语言:javascript
复制
select max(ids_.id) from ( select id from SubclassAs union select id from SubclassBs union select id from SubclassCs ) ids_ 

它需要超过12秒才能运行。这些表中的每个表都有超过一百万条记录。它将每个ID统一在一起,然后从中选择最大值。

如果我这样做:

代码语言:javascript
复制
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生成器?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2011-09-28 22:24:56

如果increment不能满足您的要求,您可以使用其他生成器策略,而且由于MySQL不支持序列,因此下一个合适的选择是hilo strategy

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7584465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档