一些其他方法提到我们使用基于 JPA 继承 (@MappedSuperclass) 和/或数据库视图,并用以下伪代码举例说明(它适用于两种方式EAGER->LAZY 或 LAZY->EAGER 场景):
@Table( name = "table_x" )
@Entity
class DaoX { @...( fetch = FetchType.EAGER ) refY ; /* ... other stuff ... */ }
通过继承
所以如果我们想让它延迟加载,我们可以像这样只用最少的额外代码来提升继承层次结构:
@Table( name = "table_x" )
@MappedSuperclass
class abstract BaseDaoX { /* ... other stuff ... */ }
@Entity
class DaoX extends BaseDaoX { @...( fetch = FetchType.EAGER ) refY ; }
@Entity
class DaoXLazy extends BaseDaoX { @...( fetch = FetchType.LAZY ) refY ; }
因此您可以将DaoXLazy 或DaoZLazy 用于您想要的场景。
通过视图(在 LAZY->EAGER 场景中)
(如果您可以将当前的EAGER 更改为LAZY,这通常更合适)
你可以用最小的负载映射你的(可能是深度嵌套的)懒惰的东西,例如像这样(我们喜欢在这里加载prop_f1和prop_b1)
-- db view:
create or replace view view_x_eager as
select
tx.*,
f.prop_f1,
b.prop_b1
from table_x tx
-- assuming tx:f ~ 1:1 and f:b ~ 1:1 for simplicity here:
left outer join table_foo f on ( f.id = tx.foo_id )
left outer join table_bar b on ( b.id = f.bar_id )
@Table( name = "view_x_eager" )
class DaoXEager extends BaseDaoX {
@...( fetch = FetchType.EAGER ) refY ;
String prop_f1 ;
String prop_b1 ;
}