猿问

休眠 OneToONe 延迟获取

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


我正在使用Spring JPAandHibernate并尝试对 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()在测试类中调用方法时,它仍然对A和执行 2 个查询B。我怎样才能延迟获取B类?提前致谢。


森栏
浏览 133回答 2
2回答

叮当猫咪

在本教程中对您的问题有答案那是因为 Hibernate 需要知道它是否应该使用 null 或代理类初始化手稿属性。它只能通过查询手稿表来找到引用此 Book 实体的记录。Hibernate 团队决定,如果他们无论如何都必须查询手稿表,最好急切地获取关联的实体。
随时随地看视频慕课网APP

相关分类

Java
我要回答