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

hibernate支持一对一关联的惰性加载吗?

韩峰
2023-03-14

默认情况下,Hibernate支持一对多/多对一和多对多关联的惰性加载。但Hibernate不支持一对一关系的延迟加载。让我们为父场景和子场景提供以下示例。

一个人有一个地址父实体定义为。

@Entity
@Table(name = “Person”)
public class Person {

...

private Address address;

@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
@Join Column(name="PERSON_ID", insert able=false, null able=false)
public Address get Address() {
return address;

...

}

子实体定义为

@Entity
@Table(name = “Address”)
public class Address {

...

private Person person;

@OneToOne(mapped By="person")
public Person get Person() {
return person;

...

}

在上面的场景中,它应该是惰性加载,但实际上hibernate正在产生急切的加载。两个select语句同时激发1)select用于父实体,在本例中为Person;2)select用于子实体,在本例中为address

那么我如何在Hibernate中使用延迟加载进行一对一映射呢?

共有1个答案

洪光霁
2023-03-14

在Hibernate中有几种实现一对一关联的方法,您可以将其映射为多对一(针对双方)。这将允许您启用惰性加载,并且当外键存储为要关联的表中的字段时,也可以这样做。

原因很简单:您并不关心关联的目标端是什么,因此您可以将其视为一个没有多部分的一对一关联。您想要的只是表达“此实体具有一个属性,该属性是对另一个实体的实例的引用”,并使用外键字段来表示该关系。

另见:

  • 休眠-为什么使用多对一来表示一对一?
  • 休眠,如何对此关系建模
 类似资料:
  • 我知道懒加载是做不到的,如果你在一对一的关系中有双向的关系。 所以我读了一篇关于如何使JPA OneToOne关系变懒的文章。 文章说你不能在一对一的关系中创建代理,但我不太理解。 我觉得多对一的关系和一对一的关系没有什么区别。他说,在多对一的关系中,您可以创建一个代理,因为您可以从fk获得值。 我觉得这两个是不一样的。我知道PK值相等,那么为什么不只有一对一的关系做懒加载呢?

  • 我有两个表,ComputerNode和Connection。ComputerNode有一个主键< code>nodeid,但连接没有主键。我无法修改表模式。如果它们有一对多的关系,我应该如何创建java POJO?基本上我的目标是做一个像这样的内部连接: 下面是 SQL 表架构。计算机节点表: 连接表: 表之间的关系是一对多的。一个计算机节点可以有多个连接 我已经创建了两个Java的POJO类,但

  • 1. 前言 本节课程和大家一起聊聊关联映射。通过本节课程的学习,你将了解到: 什么是关联映射; 如何实现一对一关联映射。 2. 关联映射 关系数据库中的数据以表为家,一张表一个家,一个家住一类数据。众多表组成关系型社区,关系型社区群体中的数据关系通过主外键方式描述。 表与表之间的数据根据彼此的关系可分为: 一对一关系: 如老公表和老婆表的关系; 一对多关系: 如用户表和银行账号表关系; 多对一关系

  • 我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。 为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。 到目前为止我所做的... 这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。 我尝试从实体中删除接口和字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得消息,并且默认情况下返回到急切加载。 我是不是