【问题标题】:OpenJPA 1.2.1: fine-grained fetch planOpenJPA 1.2.1:细粒度获取计划
【发布时间】:2011-12-05 18:27:44
【问题描述】:

假设我有以下内容:

@Entity
class Product {
  @OneToOne(Lazy)
  ProductType type;
}

@Entity
class ProductType {
  @ManyToOne(Lazy)
  ProductFamily pf;
}

@Entity
class ProductFamily {
  String name;
  // ...
}

默认情况下,OpenJPA 的 fetch depth 为 -1,如果我查询 Product:

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 和将字段添加到获取计划中,但它不起作用。


说清楚:我希望 all *-to-One relations 默认是惰性的,然后通过 fetch joins 微调关系,但似乎 OpenJPA 忽略了惰性配置。

【问题讨论】:

  • 你如何增强你的实体?

标签: java jpa openjpa


【解决方案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

如果关联是急切的,无论用于加载实体的代码如何,都会获取其关联。

【讨论】:

  • 默认情况下,由于最大获取深度,通常会获取 *-to-One 关联。我想将所有 *-to-One 默认配置为惰性,然后微调获取。但似乎当我将关联配置为惰性时,OpenJPA 无论如何都会获取它们。我必须避免这种情况的唯一方法是将 maxFetchDepth 设置为 1 左右,但是这样会忽略连接提取。
  • 如何测试惰性关联是否加载?
  • 我看生成的sql查询
  • 我不知道 OpenJPA,但他们的文档指出,必要的代码编织应该自动完成。您可以尝试在编译时执行此操作以确保:openjpa.apache.org/builds/1.0.4/apache-openjpa-1.0.4/docs/…
【解决方案2】:

我的错,为了启用延迟加载,我不得不进行类转换。如果没有字节码增强,OpenJPA 会给出警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-23
    • 2012-02-20
    • 2014-11-29
    • 1970-01-01
    • 2016-06-02
    • 2023-04-11
    • 2023-03-31
    • 2012-10-26
    相关资源
    最近更新 更多