6

我正在使用 Hibernate 对 TABLE_PER_CLASS 继承策略的支持。功能方面它运作良好。每当发出多态查询时,Hibernate 都会为我的两个具体类 A 和 B 生成一个包含“union all”的 SQL。生成的 SQL 具有以下格式:

select C1, C2, C3 from (
    select C1, C2, C3 from ClassA
  union all
    select C1, C2, C3 from ClassB
)
where 
    C1 == <value>
order by C2
limit 100

这种方法的问题在于数据库端的性能非常差。考虑到 C1 列是 ClassA 和 ClassB 的共享属性(派生自抽象父级),Hibernate 可以在两个子选择中插入 where 子句并显着提高性能。例如,

select C1, C2, C3 from ( 
    select C1, C2, C3 from ClassA where C1 == <value>
    union all
    select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100

也可以在极限上做一些优化。我在我的 DAO 层中使用 Hibernate 标准 API。

拦截器,onPrepareStatment() 无法使用,因为参数不可见。在数据库上使用分区和可能的其他选项目前超出了范围,因为我们希望在此工作阶段避免特定于数据库的优化。

知道如何操纵休眠以提高性能吗?

4

1 回答 1

0

我你想要比我不建议使用 table-pr-class 和许多或巨大的多态查询更高的跨数据库性能。鉴别器列通常会更好。

请注意,如果您的类层次结构中有两个以上的级别,则可以将 table-pr-class 与 discrimantor-columns 结合使用。

于 2012-05-23T08:45:44.820 回答