错误背景

@Data
@Entity
@Table(name = "tb_post")
public class Post implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long postId;

    /**
     * 发表用户 多对一
     */
    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id")
    @JsonIgnore
    private User user;

    private String postTitle;

    /**
     * 纯文本,图(多图,GIF)、视频
     */
    private Integer postType = PostTypeEnum.UNKNOWN.getType();
 
    @Lob
    private String postContent;

    /**
     * 图片地址
     */
    @ElementCollection(targetClass = String.class)
    @CollectionTable(name = "post_pic_urls", joinColumns = @JoinColumn(name = "id"))
    @Column(name = "pic_url")
    private List<String> imageUrl = new ArrayList<>();

    /**
     * 视频地址
     */
    private String videoUrl;
    /**
     * 评论
     */
    @OneToMany(mappedBy = "post", cascade = {CascadeType.REMOVE}, fetch = FetchType.EAGER)
    private List<Comment> comments = new ArrayList<>();
}
////省略部分代码.....

在做单元测试脚本时,曝出异常问题:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.liam.coder.model.Post.imageUrl, could not initialize proxy - no Session

原因:

在Hibernate中处理多表联查问题时,Hibernate会去自动查询关联的数据表,并通过Session对象去执行查询task,每进行一次数据库操作时都会新建一个Session对象,当我们操作完成后,SpringBoot的事物管理会自动关闭该Session。所以当我们需要查询关联的其他表则找不到可用的Session,因为Session已经关闭了,就会报错could not initialize proxy – no Session。 这是Hibernate的懒加载策略导致的,因为每一次查询我们并不会使用到查询对象关联的所有对象,所有Hibernate在查询数据库时并不会把类关联的对象统一查出来。

解决方案:

在application.properties中配置,开启懒加载:

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true