Hibernate:通过单个查询加载所有子类(单表继承)

时间:2017-06-16 08:09:44

标签: spring performance hibernate java-ee hibernate-mapping

我们决定使用带有鉴别器的hibernate继承映射策略(见10.1.3:https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch10.html#inheritance-tablepersubclass-discriminator)来加载相对少量的只读数据(单个~20 000行)表,80个实体类型,每行平均包含100个字符)。

当应用程序启动时,hibernate通过~80个查询加载这些实体+另外~150个查询来建立它们之间的关系。这当然是耗时且不必要的。

我不介意通过单个查询加载整个表,但是如何使用鉴别器列来获取实体类型映射?

当然总有选择加载&手动映射但我们想坚持使用hibernate。

抽象实体的hibernate配置:

@Entity
@DiscriminatorColumn(name = "DISCRIMINATOR_COLUMN", discriminatorType = DiscriminatorType.STRING, length = 30)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "MAIN_TABLE")
public abstract class ApplicationAbstractEntity 
... 

子类配置示例:

@Entity
public class SomeSubEntity extends ApplicationAbstractEntity  
...

为给定的子类加载实体(这对每个子类重复,80个实体类型= 80个查询):

currentHibernateSession.createCriteria(SomeSubEntity.class);

1 个答案:

答案 0 :(得分:1)

setResultTransformer与自定义转换器一起使用,将结果映射到您的实体。

您可以使用一个查询加载所有实体,例如

currentHibernateSession.createCriteria(ApplicationAbstractEntity.class).setResultTransformer(new CustomResultTransformer());