休眠OneToONe懒惰获取

时间:2018-09-10 14:30:55

标签: java hibernate spring-data-jpa lazy-loading one-to-one

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

我正在使用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;
}

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>

最后是 initdata.sql (用于h2数据库)

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

当我在测试类中调用findByName()方法时,它仍然对AB执行2个查询。我如何才能懒惰地获取B类?预先感谢。

2 个答案:

答案 0 :(得分:0)

this教程中,您对自己的问题有答案

这是因为Hibernate需要知道是否应使用null或代理类来初始化稿件属性。它只能通过查询原稿表来找到引用此Book实体的记录,才能找到答案。 Hibernate小组决定,如果他们仍然必须查询手稿表,则最好尽快获取相关实体。

答案 1 :(得分:-1)

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