我可以默认使用EAGER fetchType生成JPA实体吗?

时间:2014-07-30 09:42:22

标签: java performance hibernate jpa eager-loading

我正在使用JPA persistence.xml并使用Hibernate代码生成器生成我的实体。我的persistence.xml看起来像这样:

<persistence-unit name="my_schema">
    ... classes ...

    <properties>

        <property name="hibernate.connection.url" value="jdbc:mysql://10.12.200.101:3306/my_schema"></property>
        <property name="hibernate.default_catalog" value="my_schema" />

        <property name="hibernate.connection.username" value="my_user"></property>
        <property name="hibernate.connection.password" value="my_pass"></property>
        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"></property>
        <property name="hibernate.connection.nombre" value="my_schema" />

    </properties>
</persistence-unit>

我的所有实体默认使用FetchType.LAZY生成:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "entity_name")

默认情况下,有没有办法用FetchType.EAGER生成这个实体?

1 个答案:

答案 0 :(得分:1)

  1. 默认情况下,所有@ManytoOne@OneToOne关系均为EAGER

  2. @OneToMany关联LAZY的理由非常充分。

  3. 假设您有一个根实体:

    • Country,具有一对多关联状态
    • 每个State都有一对多关联城市
    • 每个City都有一对多的关联街道
    • 每个Street都有一对多关联HouseNumbers
  4. 如果您有默认选项来急切地获取所有这些一对多关联,那么选择一个Countryend up fetching the whole database

    这是一个主要的性能问题,您应该计划fetching strategy responsively

    1. 如果急切地获取所有一对多关联,并且一个父实体(Parent)具有2个不相关的一对多关联(子项和作业),那么获取父实体将最终进入所有一对多关联的笛卡尔积。
    2. 所以,最后:

      • 仔细规划您的获取策略
      • 较少依赖默认值
      • 在所有HQL,JPQL或Criteria查询中明确使用fetch join来提取特定作业所需的适量信息