【问题标题】:Load child entity in Hibernate based on boolean flag根据布尔标志在 Hibernate 中加载子实体
【发布时间】:2020-05-28 11:16:19
【问题描述】:

如果父实体中的布尔标志设置为true,Hibernate 3.6 中是否有办法仅加载子实体?

例如:

@Entity
class Parent {
  @OneToOne
  private Child child;
  private boolean loadChild;
}

因此,如果 loadChild == false,则不应从 db 加载子级并且始终为 null,否则应加载(当然,如果可用)。目前,孩子正在急切地加载,保持这种状态会很好。

基本上,我们在这里要防止的是子项的实际加载以及这可能产生的所有性能影响。加载它然后使用 getter 返回 null 会很容易,但是加载实际上不需要的子节点会影响性能。

【问题讨论】:

  • 这和 Hibernate 有什么关系?此外,更多的上下文会有所帮助,这样我们就不会在这里遇到典型的 X-Y-Problem
  • 好吧,我们使用 Hibernate 来管理这些实体。我不确定我还能在这里给出什么上下文。真的就是这样……
  • 好吧,这是如何在代码中使用的示例。此外,Child 是否使用 @OneToOne 关系关联?然后你可以让它EAGER加载等等。
  • 是的,它是 OneToOne,目前正在热切地加载,如果可能,我们希望保持这种状态。
  • 那么究竟是什么是问题所在?它要么在加载期间被初始化(因为它是 EAGER),要么如果它不存在则为空。

标签: java hibernate hibernate-mapping


【解决方案1】:

我不确定JPA 和/或Hibernate 是否直接支持这一点。一种解决方法可以是:

loadChild 向下移动到Child,然后在Parent 中使用@Where

但是,在字段级别,@Where 仅适用于集合值属性。所以你必须用Collection 包裹孩子,@Where 才能工作。

@Where(clause = "load_with_parent = true") // lets say the column name is load_with_parent
@OneToMany
private List<Child> childs;


进一步阅读:

【讨论】:

  • 很遗憾,这不是孩子的决定。孩子也可以包含在几十个其他父母中,他们都有自己的看法关于加载或不加载它。我需要的是@WhereParent,但不幸的是,我们只有@Where@WhereJoinTable ;-)
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多