我知道这个问题已经问过几次了,但是我找不到一个清晰的例子来回答这个问题(我也尝试过其他可能的解决方案)。
我正在使用Spring JPA
和Hibernate
并尝试对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()
方法时,它仍然对A
和B
执行2个查询。我如何才能懒惰地获取B
类?预先感谢。
答案 0 :(得分:0)
在this教程中,您对自己的问题有答案
这是因为Hibernate需要知道是否应使用null或代理类来初始化稿件属性。它只能通过查询原稿表来找到引用此Book实体的记录,才能找到答案。 Hibernate小组决定,如果他们仍然必须查询手稿表,则最好尽快获取相关实体。
答案 1 :(得分:-1)
据我所知,避免2个查询是不可能的,因为Hibernate需要知道在“一对一字段”中应该插入什么-代理或null。如果辅助表中有相关记录,则将代理插入到您的对象中;如果没有任何记录,则将NULL插入。因此休眠执行第二个查询以进行检查。 插入“一对一”即可使用“多对一”