当前位置: 首页 > 知识库问答 >
问题:

关于JPA一对一惰性加载的问题

贺劲
2023-03-14

我知道懒加载是做不到的,如果你在一对一的关系中有双向的关系。

所以我读了一篇关于如何使JPA OneToOne关系变懒的文章。

文章说你不能在一对一的关系中创建代理,但我不太理解。

我觉得多对一的关系和一对一的关系没有什么区别。他说,在多对一的关系中,您可以创建一个代理,因为您可以从fk获得值。

// one to one
class Address {

 ..
 @OnetoOne(fetch = LAZY)
 @JoinColumn(~)
 private Order order;
}

class Order {

 ..
 @OnetoOne(mappedBy = order, fetch = LAZY)
 private Address address; // LAZY not wokring
}
// ManyToOne

public class Member {
  @ManyToOne(fetch = LAZY)
  @JoinColmn(~)
  public Team team;  // LAZY working!
}

我觉得这两个是不一样的。我知道PK值相等,那么为什么不只有一对一的关系做懒加载呢?

共有1个答案

阎渝
2023-03-14

地址成员是相同的。他们拥有代表该协会的列。例如,我们假设表member中的列team_id和表address中的列order_id

当Hibernate ORM从表member中读取一行时,通过检查team_id列的值,它知道该值是否为null或是否存在关联。因此,当创建实体时,它可以决定映射关联的值(mapping#team)是null还是代理。在这种情况下,可以进行惰性提取。

order没有表示关联的列,这是因为关联是由address中的列order_id映射的。当Hibernate ORM需要将表order中的一行转换为实体时,它还需要检查表address以查看是否存在关联。根据结果,它将值order#address设置为null或关联地址。在这种情况下,如果不检查表address,它就无法知道关联的值是否为空:惰性提取是不可能的。

注意,当映射声明关联永远不为空时,仍然可以延迟提取关联:@OneToOne(MappedBy=“order”,optional=false)

 类似资料:
  • 请注意,我已经看过类似的问题,我已经解释了为什么它们对我不起作用 我有一个简单Spring boot JPA-Hibernate应用程序,它具有用户和地址之间的一对一映射。(请注意,我对一对多映射没有这个问题) 用户实体 员额1 我还读到spring.jpa.open-in-view defualt值可能是罪魁祸首: 员额2 通过将添加到我的中,我禁用了默认的“在视图中打开”属性 我假设这是因为J

  • 默认情况下,Hibernate支持一对多/多对一和多对多关联的惰性加载。但Hibernate不支持一对一关系的延迟加载。让我们为父场景和子场景提供以下示例。 一个人有一个地址父实体定义为。 子实体定义为 在上面的场景中,它应该是惰性加载,但实际上hibernate正在产生急切的加载。两个select语句同时激发1)select用于父实体,在本例中为Person;2)select用于子实体,在本例中

  • 我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西 我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们 1/ 2/ JPQL查询: =>两次

  • 我在数据库中有两个表一对一的关系: 我必须使用来编写Java实体类: 客户端类: 占有实体: 我有一个klientMB,它添加了人和地址 但是当我尝试添加一个Klient时,我出现了这个错误:

  • 问题内容: 我有一个关于JPA-2.0(提供者为Hibernate)关系及其在Java中的相应管理的问题。假设我有一个Department和一个Employee实体: 现在,我知道我必须自己管理Java关系,如以下单元测试所示: 如果我遗漏任何一个,否则断言将失败。到目前为止,一切都很好。如果我在两者之间提交数据库事务该怎么办? 我还需要管理双方关系吗?不,事实证明,我不必这样做。有了这个修改 这

  • 我有一个JAX-RS资源类。它调用一个加载实体的无状态EJB(我们称之为)。 与另一个实体具有关系(我们称之为),并且配置为具有的提取类型。 任何东西上都不会出现额外的事务性注释,因此无状态EJB的默认行为是在必要时启动事务,并在事务的业务方法完成后提交事务。 在调试器中,我观察到EJB返回的将作为的值,正如我所怀疑的那样。因此,惰性加载工作良好。 然后,我的资源类构建一个并将控制权交给JAX-R