Hibernate OneToOne延迟加载

8

我知道这个问题已经被问了好几次,但是我找不到一个清晰的例子和答案来解决这个问题(我也尝试了其他可能的解决方案)。

我正在使用Spring JPAHibernate,并尝试对OneToONe关系进行延迟加载。我有两个简单的实体类,一个仓库类,并使用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;
}

二类地址

@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类?提前感谢。


1
我也有同样的问题,希望已经有人解决了这个问题。 - sarah
请查看此答案:https://dev59.com/WHM_5IYBdhLWcg3wSBAU - Martin
1
我已经检查过了。 - Alperen Üretmen
你找到答案了吗?根据我的经验,如果你在两个表中使用共享的主键,那么它会起作用。我曾经遇到过同样的问题,但共享主键不是一个选项。 - Beginner
2个回答

0
this教程中有关于你问题的答案。
Hibernate需要知道它是否应该使用null或代理类来初始化手稿属性。它只能通过查询手稿表来找到引用此Book实体的记录来确定。Hibernate团队决定,如果他们必须查询手稿表,最好是急切地获取关联的实体。

-1

据我所知,无法避免两个查询,因为Hibernate需要知道应该将代理还是null插入到您的“一对一字段”中。如果辅助表中存在相关记录,则将代理插入到对象中,如果没有记录,则插入NULL。因此,Hibernate执行第二个查询进行检查。 您可以使用“多对一”代替“一对一”


我阅读了一些关于构建时间字节码插装的文章,大多数人都说这是可能的。我认为我在代码结构上错过了什么,但感谢您的回答。 - Alperen Üretmen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接