Spring JPA+Hibernate多对多桥接表关联数据查询失败问题
多对多关联查询关联数据为空的解决方案
检查关联注解的fetch属性
JPA多对多关联默认是FetchType.LAZY懒加载模式,要是你在持久化上下文关闭后再去访问关联集合,自然拿不到数据。你可以直接把关联的fetch改成FetchType.EAGER,或者在查询时用JOIN FETCH主动加载关联数据:
实体类配置示例:@ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "films_genres", joinColumns = @JoinColumn(name = "film_id"), inverseJoinColumns = @JoinColumn(name = "genre_id") ) private List<Genre> genres;Repository查询方法示例:
@Query("SELECT f FROM Film f JOIN FETCH f.genres") List<Film> retrieveAllFilms();确认关联映射配置完全匹配
核对桥接表films_genres的映射:表名、关联字段(film_id、genre_id)有没有拼写错误,@JoinColumn里的name值要和数据库字段完全一致。如果是双向关联,Genre实体里要正确配置@ManyToMany(mappedBy = "genres"),避免重复映射导致关联失效。保证查询与关联访问在同一事务内
如果retrieveAllFilms方法返回后才去访问Film的关联集合,此时EntityManager已经关闭,懒加载的集合无法初始化。可以给Service层的方法加上@Transactional注解,让查询和后续的关联数据访问都处于同一个事务中,维持持久化上下文的有效性。排查二级缓存导致的数据不一致
要是开启了Hibernate二级缓存,缓存里的Film对象可能没同步最新的关联数据。可以尝试清空缓存,或者在查询时强制刷新缓存:@QueryHints(value = @QueryHint(name = org.hibernate.annotations.QueryHints.CACHE_MODE, value = "REFRESH")) List<Film> retrieveAllFilms();
内容的提问来源于stack exchange,提问作者Ciaowilly
相关产品推荐
相关产品推荐

