假设我有以下内容:
@Entity
class Product {
@OneToOne(Lazy)
ProductType type;
}
@Entity
class ProductType {
@ManyToOne(Lazy)
ProductFamily pf;
}
@Entity
class ProductFamily {
String name;
// ...
}
默认情况下,OpenJPA的抓取深度为 -1 ,如果我查询产品似乎:
select p from Product p
最终会查询这样的内容:
select p from product p
left join product_type
left join product_family
我已经阅读了有关抓取深度的内容,我可以将抓取深度限制为 1 ,这意味着查询只会获取直接关系:
select p from product p
left join product_type
但是如何自定义查询以便能够为嵌套关系指定获取连接?我已经尝试了left fetch join
和添加字段到获取计划,但它不起作用。
说清楚:我希望所有 *-to-One relations
默认为懒惰,然后通过fetch joins
微调关系,但似乎OpenJPA忽略了懒惰的配置。
答案 0 :(得分:1)
不确定我理解。如果您希望能够指定必须提取的内容,则需要将关联标记为延迟,并使用查询加载对象。默认情况下* ToOne关联是渴望的,而* ToMany关联是懒惰的。标记为延迟后,可能会出现以下查询:
select p from Product p // load only the products
select p from Product p
left join fetch p.type // load products with their type
select p from Product p
left join fetch p.type t
left join fetch t.pf // load products with their type and the family of their type
如果关联是急切的,无论用于加载实体的代码如何,都将获取其关联。
答案 1 :(得分:1)
我的不好,我不得不转向类转换才能启用延迟加载。随着字节码增强,OpenJPA会发出警告,说明这一点。