在调用jpa的预生成方法getOne提示异常
org.hibernate.LazyInitializationException:
could not initialize proxy [com.cashbook.trunk.business.tally.domain.Tally#28] - no Session
原因:遇到延迟加载,session关闭了,导致不能得到有效信息
解决1:
在调用该方法的层级添加事务@Transactional(感谢BigBigChris的指点)
解决2:
Properties添加spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
但是该方式不太友好,不建议使用,每次初始化一个实体的关联就会创建一个临时的session来加载,每个临时的session都会获取一个临时的数据库连接,开启一个新的事物。这就导致对底层连接池压力很大,而且事物日志也会被每次flush.
解决3:
使用findById来替代getOne(注意,findById返回的是Optional)
ps:
Tally tally = tallyRepository.findById((long) 99).orElse(null);//使用orElseGet时对象为空会报异常