【问题标题】:Can I generate JPA entities with EAGER fetchType by default?我可以默认使用 EAGER fetchType 生成 JPA 实体吗?
【发布时间】:2014-07-30 09:42:22
【问题描述】:

我正在使用 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 生成这些实体?

【问题讨论】:

    标签: java performance hibernate jpa eager-loading


    【解决方案1】:
    1. 所有@ManytoOne@OneToOne 关系默认为EAGER

    2. @OneToMany 关联是 LAZY 是有充分理由的。

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

      • Country,具有一对多关联状态
      • 每个State 都有一个一对多的关联城市
      • 每个City 都有一个一对多的关联街道
      • 每个Street 都有一个一对多关联HouseNumbers

    如果您有急切获取所有这些一对多关联的默认选项,则可能是选择一个Countryend up fetching the whole database

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

    1. 如果急切地获取所有一对多关联,并且一个父实体 (Parent) 有 2 个不相关的一对多关联(子和作业),那么获取父实体将以笛卡尔坐标结束所有一对多关联的产物。

    所以,总而言之:

    • 仔细规划您的抓取策略
    • 减少对默认的 `EAGER fetching 的依赖
    • 在所有 JPQL 或 Criteria API 查询中明确使用 fetch 连接,以提取特定作业所需的适量信息

    【讨论】:

    • 是的,我的问题确实与 OneToMany 关系有关。我有一个很小的数据库,然后我认为效率不会成为问题。我不喜欢每次重新生成实体时都必须手动修改所有 OneToMany 关系的事实。
    • 但是如果你有一个小数据库,你就没有那么多一对多的关联。您可以简单地为所有这些设置 fetch EAGER 属性。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多