我知道这个问题已经被问了好几次,但是我找不到一个清晰的例子和答案来解决这个问题(我也尝试了其他可能的解决方案)。
我正在使用Spring JPA
和Hibernate
,并尝试对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()
方法时,它仍然会执行A
和B
的2个查询。如何懒加载B
类?提前感谢。