@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 有什么办法吗
1
zhzy0077 2023-07-31 23:42:57 +08:00 1
|
2
KevinBlandy 2023-08-01 08:36:14 +08:00
我是 JPA 重度用户,但是从来不敢用这种 OOP 建模。实在是拿捏不住,太难维护了。
推荐一个优质的 spring/boot/data/security/cloud 的中文文档,无广告,无须登录,无须关注,在线读。 https://springdoc.cn/ |
3
qinxi 2023-08-01 09:02:07 +08:00
开启 OpenSessionInView
|
4
wganbleuthall OP @qinxi 不推荐 https://www.baeldung.com/spring-open-session-in-view
问题找到了已经,很蠢 @Transactional public CommandLineRunner runner() { return args -> { 这种写法 导致 sql 不在同个事务里 |
5
Belmode 2023-08-01 15:57:10 +08:00
@Transactional 的作用没整明白
|