繁体   English   中英

休眠 OneToONe 延迟获取

[英]Hibernate OneToONe Lazy Fetching

我知道这个问题被问了好几次,但我找不到关于这个主题的明确例子和答案(我也尝试了其他可能的解决方案)。

我正在使用Spring JPAHibernate并尝试对 OneToONe 关系进行延迟获取。 我有 2 个简单的实体类,一个 Repository 类并使用 h2 数据库来延迟加载实体。 我尝试构建时间字节码检测来实现这一点,这些是我的课程。

A级

@Entity
public class A {

    private String name;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(optional = false, fetch = FetchType.LAZY, mappedBy = "a")
    @LazyToOne(LazyToOneOption.NO_PROXY)
    private B b;
}

B级

@Entity
public class B {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "A_ID")
    private A a;
}

存储库

public interface ARepository extends JpaRepository<A, Long> {
    A findByName(String name);
}

pom.xml字节码增强器

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <failOnError>true</failOnError>
                <enableLazyInitialization>true</enableLazyInitialization>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

最后是 h2 数据库的initdata.sql

insert into a (name, id) values ('a', 1);
insert into b (a_id, id) values (1, 1);

当我在测试类中调用findByName()方法时,它仍然对AB执行2个查询。 我怎样才能懒惰地获取B类? 提前致谢。

教程中对您的问题有答案

那是因为 Hibernate 需要知道它是否应该使用 null 或代理类初始化手稿属性。 它只能通过查询手稿表来找到引用此 Book 实体的记录。 Hibernate 团队决定,如果他们无论如何都必须查询手稿表,最好急切地获取关联的实体。

据我所知,避免 2 个查询是不可能的,因为 Hibernate 需要知道应该在“一对一字段”中插入什么 - 代理或空值。 如果辅助表中有相关​​记录,则将代理插入到您的对象中,如果没有任何记录,则为 NULL。 所以休眠执行第二个查询进行检查。 Insted“一对一”你可以使用“多对一”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM