如果我使用本机查询,我试图理解EclipseLink行为。所以我有这样的实体:
class Entity {
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_id")
private OtherEntity otherEntity;
@Column(name = "name")
private String name;
//gets ... sets ...
}
和相应的表格如下:
**ENTITY**
INTEGER ID;
VARCHAR NAME;
OTHER_ENTITY_ID;
然后我运行本机查询
Query query = getEntityManager().runNativeQuery("select * from ENTITY", Entity.class);
query.getResultList()
在Entity
内,我声明了OtherEntity otherEntity
,注明了FetchType.LAZY
,但是我的查询选择了(*) - 所有列,包括OTHER_ENTITY_ID。问题是 - 如果我运行提取所有列的本机查询,那么注释了FetchType.LAZY
的字段是否填充为FetchType.EAGER
?我之前从未使用过EclipseLink,并决定是否值得使用它,所以我非常感谢任何帮助
谢谢,干杯
答案 0 :(得分:0)
我的第一个建议是打开EclipseLink的SQL日志记录,并执行等效的JPQL来加载您要查找的内容,并查看SQL EclipseLink生成的内容,以了解构建对象所需的内容在您的本机查询中,基于您当前的映射。
关系通常使用从外键读入的值加载辅助查询,因此急切或延迟提取不受读入的本机查询的影响"实体" - 无论获取类型如何,查询都需要other_entity_id值。当需要基于eager / lazy加载时,EclipseLink将发出映射所需的查询。
您可以通过标记关系使用joining来更改此设置。在这种情况下,EclipseLink不仅会期望实体值在查询中,还会引用引用的OtherEntity值。