8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

为什么 Hibernate 不能延迟获取 @ManyToOne 和 @OneToOne?

blogofsongs 2月前

21 0

经过一些令人沮丧的问题和测试后,我了解到 Hibernate 无法延迟获取 ToOne 关系。从我所读的内容来看,Hibernate 通过将其自己的 Set 设置为代理来延迟获取 ToMany,并且...

经过一些令人沮丧的问题和测试后,我了解到 Hibernate 无法延迟获取 ToOne 关系。

据我所知,hibernate 通过将其自己的 Set 设置为代理来延迟获取 ToMany,并且当在该 Set 上调用方法时,它会在执行操作之前获取数据库中的数据。很好。

对于 ToOne,我看到的原因是,由于属性可以为 null(与 ToMany 不同),因此 hibernate 必须知道是否需要用 null 或代理来填充它,并且 hibernate 如果不查询另一个表就无法知道这一点。而且由于它必须查询另一个表,因此它会同时急切地获取数据。

我觉得这很愚蠢。我可以在关系的非拥有方理解这一点,其中表中没有任何内容表明 toOne 是否已填充,但在拥有方,表包含一个带有外键的列,该列为空或不为空。

为什么 Hibernate 不能查询表并根据该列的值将属性设置为 null 或代理?它不需要检查第二个表,如果您的列不为 null,您就知道第二个表有一个相应的条目(如果没有,则存在完整性问题,Hibernate 应该抛出)。

帖子版权声明 1、本帖标题:为什么 Hibernate 不能延迟获取 @ManyToOne 和 @OneToOne?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由blogofsongs在本站《hibernate》版块原创发布, 转载请注明出处!
最新回复 (0)
  • Hibernate 的行为或多或少符合您的描述。

    在拥有端,hibernate 支持延迟加载,只是默认情况下不启用。您需要添加它 @OneToOne(fetch = FetchType.LAZY)

    但是当您双向映射(在两个实体上)时,正如您所说,Hibernate 需要查询表来决定是使用 null 还是代理。因此开发人员决定急切加载整个实体。无论提取类型如何。

    您可以通过删除外键并 使用相同的主键值来 .

    您可以通过 @MapsId 拥有方的注释来实现这一点。

    @Entity
    public class Owning {
     
        @Id
        private Long id;
     
        @OneToOne
        @MapsId
        @JoinColumn(name = "id")
        private Child child;
     
    }
    
  • 看来你是对的。我太专注于我读到的所有内容,说惰性 ToOne 很难甚至不可能,以至于我连最简单的实际测试任务都失败了。你有没有关于它的文档/文章的参考资料,因为我仍然找不到太多关于它的信息。

返回
作者最近主题: