OpenJPA 1.2.1:细粒度的获取计划

时间:2011-12-05 18:27:45

标签: java jpa openjpa

假设我有以下内容:

@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忽略了懒惰的配置。

2 个答案:

答案 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会发出警告,说明这一点。