Hibernate OneToONe Lazy Fetching

Alp*_*men 6 java hibernate lazy-loading one-to-one spring-data-jpa

我知道这个问题被问了好几次,但是我找不到一个明确的例子并且回答了这个话题(我也尝试了其他可能的解决方案).

我正在使用Spring JPAHibernate尝试对OneToONe关系进行延迟获取.我有2个简单的Entity类,一个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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

知识库

public interface ARepository extends JpaRepository<A, Long> {
    A findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

最后用于h2数据库的initdata.sql

insert into a (name, id) values ('a', 1);
insert into b (a_id, id) values (1, 1);
Run Code Online (Sandbox Code Playgroud)

当我findByName()在测试类中调用方法时,它仍然为A和执行2个查询B.我怎么懒得取B课?提前致谢.

小智 -1

据我所知,避免 2 个查询是不可能的,因为 Hibernate 需要知道应该在“一对一字段”中插入什么内容 - proxy 或 null。如果辅助表中有相关​​记录,则将代理插入到您的对象中;如果没有任何记录,则将代理插入到您的对象中。因此 hibernate 执行第二个查询来进行检查。安装“一对一”后,您可以使用“多对一”