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

Hibernate:一对一延迟加载,可选=false

尉迟德惠
2023-03-14

我面临的问题是一对一的惰性加载在Hibernate中不起作用。我已经解决了,但还是不明白会发生什么。

我的代码(懒惰加载在这里不起作用,当我拉person-address也被提取):

@Entity
public class Person{

  @Id
  @SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
  @Column(name = "id")
  private long personID;

  @OneToOne(mappedBy="person", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
  private Adress address;
  //.. getters, setters
}

@Entity
public class Address {

  @Id
  @Column(name="id", unique=true, nullable=false)
  @GeneratedValue(generator="gen")
  @GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="person"))
  private long personID;

  @PrimaryKeyJoinColumn
  @OneToOne
  private FileInfo person;
}

但是:如果我在OneToOne关系中添加optional=false,那么惰性加载工作很好!

@OneToOne(mappedBy="person", cascade=CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
private Adress address;

问题/恳求:请给我解释一下optional=false注释如何帮助实现延迟加载。

附注。我看过post1和post2,明白了为什么简单的OneToOne不能偷懒,但我还是不能掌握optional=false的魔力。

共有1个答案

方兴旺
2023-03-14

如果关联是可选的,则Hibernate在不发出查询的情况下无法知道给定人员的地址是否存在。因此它不能用代理填充地址字段,因为可能没有引用该人员的地址,并且它不能用null填充,因为可能有引用该人员的地址。

当您将关联设置为强制性(即optional=false)时,它信任您并假定存在地址,因为关联是强制性的。因此它直接用代理填充地址字段,知道有一个地址引用了这个人。

 类似资料:
  • 问题内容: 我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。 我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取): 但是 :如果我添加 OneToOne关系,则延迟加载 效果很好 ! 问题/完整性: 请向我解释注释如何帮助实现延迟加载。 PS 我已经阅读了post1和post2的帖子,并了解了为

  • 当执行session . create query(" from Author ")时。list();即使关系被标记为optional=false,fetch type = lazy from Author- Hibernate:选择author0_。作者ID为作者I1 0,作者0。电子邮件为email2_0_,author0_。名为name3_0_ from AUTHOR author0_ Hi

  • 问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最

  • 问题内容: 如果实体A具有与实体B的双向一对一或零对一映射。 映射如下: 和 当我对EntityA进行hql查询(或更确切地说,是命名的hql查询)时,hibernate会急切地用单独的select语句加载EntityA#propertyB。 我的问题是,如果我的hql返回1000个EntityA(所有人都有各自的EntityB),hibernate将执行n + 1个查询(第一个查询是针对Enti

  • 本文向大家介绍Mybatis一对一延迟加载实现过程解析,包括了Mybatis一对一延迟加载实现过程解析的使用技巧和注意事项,需要的朋友参考一下 需求:用户和账户一对一关系,查询账户时实现用户的延迟加载 思路:根据id查询,需要延迟加载的一方 1、用户实体类 2、账户实体类 3、用户持久层接口 4、账户持久层接口 5、全局配置文件 6、用户映射配置文件 7、账户映射配置文件 以上就是本文的全部内容,

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l