Alp*_*men 6 java hibernate lazy-loading one-to-one spring-data-jpa
我知道这个问题被问了好几次,但是我找不到一个明确的例子并且回答了这个话题(我也尝试了其他可能的解决方案).
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
知识库
public interface ARepository extends JpaRepository<A, Long> {
A findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
最后是用于h2数据库的initdata.sql
insert into a (name, id) values ('a', 1);
insert into b (a_id, id) values (1, 1);
Run Code Online (Sandbox Code Playgroud)
当我findByName()在测试类中调用方法时,它仍然为A和执行2个查询B.我怎么懒得取B课?提前致谢.
小智 -1
据我所知,避免 2 个查询是不可能的,因为 Hibernate 需要知道应该在“一对一字段”中插入什么内容 - proxy 或 null。如果辅助表中有相关记录,则将代理插入到您的对象中;如果没有任何记录,则将代理插入到您的对象中。因此 hibernate 执行第二个查询来进行检查。安装“一对一”后,您可以使用“多对一”
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |