我使用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 ?
-
所有
@ManytoOne
和@OneToOne
的关系默认为EAGER
-
@OneToMany
与LAZY
的关联是有充分理由的。 -
假设你有一个根实体:
-
Country
,具有一对多的关联状态 - 每个
State
有一对多关联城市 - 每个
City
有一对多关联街道 - 每个
Street
都有一对多关联HouseNumbers
-
如果你有一个默认的抓取所有这些一对多关联的选项,选择一个Country
可能最终会抓取整个数据库。
这是一个主要的性能问题,你应该计划你的抓取策略响应。
- 如果所有的一对多关联都被急切地获取,并且一个父实体(
Parent
)有2个不相关的一对多关联(子和作业),那么获取父实体将以所有一对多关联的笛卡尔积结束。 - 仔细规划获取策略
- 对默认的"EAGER抓取"依赖较少
- 在所有JPQL或Criteria API查询中显式地使用fetch连接来提取特定作业所需的适量信息
所以,总结: