@Entity
public class ReckonerEntity {
@OneToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "from_acct")
private AccountsEntity fromAcctEntity;
}
@Entity
public class AccountsEntity { }
public interface ReckonerRepository extends JpaRepository<ReckonerEntity, UUID>, JpaSpecificationExecutor<ReckonerEntity> { }
@Bean
@Transactional
public CommandLineRunner runner() {
return args -> {
List<ReckonerEntity> reckoner = reckonerRepository.findAll();
ReckonerEntity reckonerEntity = reckoner.get(0);
AccountsEntity fromAcctEntity = reckonerEntity.getFromAcctEntity();
log.info(fromAcctEntity.getName());
};
}
运行之后出错:org.hibernate.LazyInitializationException: could not initialize proxy [.....] - no Session 我尝试了 transactional 所有的 propagation 都不行,这明显是懒加载的错误
解决方案:
但是这所有的解决方案本质上不都是 eager loading 吗??
按照我的理解,上面的代码如果是 lazy loading 应该会 log 两条无 join 的 SQL, 但是我能查到的所有解决方案最终都会导致只生成一条 join 的 SQL
如果自己实现 dao 层, entity 等所有代码不变, 也就是 @PersistenceContext 注入 entityManager 的方式,可以完美的做到 lazy loading ,log 两条 SQL
我就不懂了,所以 spring data jpa 就是不能实现 lazy loading 吗??? 我就想要 lazy loading ,不要 eager loading 有什么办法吗
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.