有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Hibernate中onetoone、manytoone和onetomany的java默认获取类型

hibernate映射中的默认获取类型是什么

探索之后,我了解到:

  • 对于一对一,它是渴望的
  • 对于一对多来说,它是懒惰的

但在Eclipse中测试之后,它对所有这些都非常渴望

这是否取决于我使用的是JPA还是Hibernate


共 (4) 个答案

  1. # 1 楼答案

    我知道在问这个问题时答案是正确的,但由于人们(像我这一分钟)仍然碰巧发现他们在想为什么他们的WildFly 10表现不同,我想为当前的Hibernate 5提供一个更新。x版本:

    Hibernate 5.2 User Guide中,它在第11.2章中说明。应用获取策略:

    The Hibernate recommendation is to statically mark all associations lazy and to use dynamic fetching strategies for eagerness. This is unfortunately at odds with the JPA specification which defines that all one-to-one and many-to-one associations should be eagerly fetched by default. Hibernate, as a JPA provider, honors that default.

    因此,Hibernate的行为也与上述JPA的Ashish Agarwal类似:

    OneToMany: LAZY
    ManyToOne: EAGER
    ManyToMany: LAZY
    OneToOne: EAGER
    

    (见JPA 2.1 Spec

  2. # 2 楼答案

    这取决于您使用的是JPA还是Hibernate

    JPA 2.0 spec中,默认值为:

    OneToMany: LAZY
    ManyToOne: EAGER
    ManyToMany: LAZY
    OneToOne: EAGER
    

    在冬眠中,一切都是懒惰的

    更新:

    Hibernate的最新版本与上述JPA默认值一致

  3. # 3 楼答案

    为了回答您的问题,Hibernate是JPA标准的一个实现。Hibernate有自己的操作怪癖,但根据Hibernate docs

    By default, Hibernate uses lazy select fetching for collections and lazy proxy fetching for single-valued associations. These defaults make sense for most associations in the majority of applications.

    所以Hibernate总是使用延迟抓取策略加载任何对象,不管您声明了什么类型的关系。它将为一对一或多对一关系中的单个对象使用一个惰性代理(应该未初始化但不为null),以及一个null集合,当您尝试访问它时,它将使用该集合中的值

    应该理解,除非指定fetchType.EAGER,否则Hibernate仅在您尝试访问对象时尝试用值填充这些对象

  4. # 4 楼答案

    对于单值关联,即-一对一和多对一:-
    默认延迟=代理
    代理延迟加载:-这意味着已加载关联实体的代理对象。这意味着仅为关联实体的代理对象加载连接两个实体的id。
    例如:A和B是具有多对一关联的两个实体。ie:每个B可能有多个A。A的每个对象将包含B的引用。
    `

    public class A{
        int aid;
        //some other A parameters;
        B b;
    }
    public class B{
        int bid;
         //some other B parameters;
    }
    

    `
    关系A将包含列(实体A的aid、bid等其他列)
    关系B将包含列(投标,…实体B的其他列)

    代理意味着在提取A时,只提取B的id,并将其存储到只包含id的B的代理对象中。 B的代理对象是代理类的对象,代理类是B的子类,只有最小字段。 由于bid已经是关系A的一部分,因此无需启动查询即可从关系B获取bid。 只有在访问bid以外的字段时,才会延迟加载实体B的其他属性

    对于集合,即多对多和一对多:-
    默认延迟=true


    还请注意,获取策略(选择、加入等)可以覆盖延迟。 ie:如果lazy='true'和fetch='join',则获取A也将获取B或B(对于集合)。如果你仔细想想,你就能找到原因。
    单值关联的默认提取为“join”。
    集合的默认提取是“选择”。 请验证最后两行。我从逻辑上推断了这一点