spring-data-jpa如何在特定的时候获取lazy加载的数据
比如说我有两个实体EntityA, EntityB,是多对多关系,并且互相指定默认使用Lazy加载
@Entity
public class EntityA implements Serializable {
...
@ManyToMany(fetch = FetchType.LAZY)
private List<EntityB> entityBList = new ArrayList<>();
...
}
@Entity
public class EntityB implements Serializable {
...
@ManyToMany(mappedBy = "entityBList", fetch= FetchType.LAZY)
private List<EntityA> entityAList = new ArrayList<>();
...
}
在做单元测试的时候,如果通过A获取B的List,会抛出LazyInitializationException
@Test
public void test() throws Exception {
EntityA a = dao.findOne(id);
List<EntityB> bList = a.getEntityBList();
bList.size(); // 这里抛出异常
}
如果在@Test
下加上@Transactional
倒是可以
但是如果把find方法提出来作为一个新方法调用,则又不行了。。。
@Test
public void test() throws Exception {
this.getAwithLazyData();
}
@Transactional
public void getAwithLazyData(id) {
EntityA a = dao.findOne(id);
List<EntityB> bList = a.getEntityBList();
bList.size(); // 这里仍然抛出异常
}
当然,如果将fetch= FetchType.LAZY
改为fetch= FetchType.EAGER
是不会抛异常
不过每次查询就都会带出关联数据了。。。
但我只想在特定的时候带出关联数据,请问应该怎么处理。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
感谢 @Oracle_Ming 的回复。
在找了一些资料之后,发现了一个解决方法,换了一个思考方向
该方法在spring-boot 1.5.6中测试通过
使用
@NamedEntityGraph
相关注解Entity上:
对应的Dao上:
这样,如果调用的是原本的
findOne
方法,则查询结果中的entityBList为lazy数据,无法取出。如果调用
findWithEntityBById
方法,则查询结果中已经带出了entityBList,可以直接使用。不知道有没有更好的方案。
我觉得是session过期的原因,你试试不用JPA findOne 查询,改用手写hql,session.query() 试试看。
你可以在
@Query
的 sql语句中使用join fetch
,比如:参考:
https://stackoverflow.com/que...
https://www.thoughts-on-java....
也可以看看这个视频,需要科学上网:
https://www.youtube.com/watch...