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



我使用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. 所有@ManytoOne@OneToOne的关系默认为EAGER

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

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

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

如果你有一个默认的抓取所有这些一对多关联的选项,选择一个Country可能最终会抓取整个数据库。

这是一个主要的性能问题,你应该计划你的抓取策略响应。

  • 如果所有的一对多关联都被急切地获取,并且一个父实体(Parent)有2个不相关的一对多关联(子和作业),那么获取父实体将以所有一对多关联的笛卡尔积结束。
  • 所以,总结:

    • 仔细规划获取策略
    • 对默认的"EAGER抓取"依赖较少
    • 在所有JPQL或Criteria API查询中显式地使用fetch连接来提取特定作业所需的适量信息

    最新更新