java—为什么hibernate不能懒洋洋地获取@manytoone和@onetoone?

tgabmvqs  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(378)

在一些令人沮丧的问题和测试之后,我读到hibernate不能懒洋洋地获取toone关系。
据我所知,hibernate通过将自己的集设置为代理来懒洋洋地获取tomany,当对该集调用方法时,它会在执行操作之前获取数据库中的数据。好的。
对于toone,我看到的原因是,由于属性可以为null(不像tomany),hibernate必须知道它是需要用null还是代理来填充它,并且hibernate在不查询另一个表的情况下无法知道这一点。因为它必须查询另一个表,所以它急切地同时获取数据。
我觉得那很愚蠢。我可以在关系的非所有者侧理解它,表中没有任何内容指示是否填充了toone,但是在所有者侧,表包含一个带有外键的列,该外键为null或不为null。
为什么hibernate不能查询表并根据该列的值将属性设置为null或代理?它不需要检查第二个表,如果您的列不为null,您就知道第二个表有相应的条目(如果没有,您就有完整性问题,hibernate应该抛出)。

vfhzx4xs

vfhzx4xs1#

hibernate的行为与你描述的差不多。
在拥有端hibernate支持延迟加载,只是默认情况下没有启用。你需要加进去 @OneToOne(fetch = FetchType.LAZY) 但是当您有了Map的双向(在两个实体上)时,正如您所说的,hibernate需要查询表来决定是null还是proxy。因此开发人员决定急切地加载整个实体。无论获取类型如何。
您可以通过去掉外键并使用相同的主键值来避免这些问题。
你可以用它来做 @MapsId 拥有方的注解。

@Entity
public class Owning {

    @Id
    private Long id;

    @OneToOne
    @MapsId
    @JoinColumn(name = "id")
    private Child child;

}

相关问题