欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate 遇到的坑

程序员文章站 2022-06-20 10:42:51
...

在传统的java开发中,通常分领域模型,model。在对数据进行保存的时候通常一般会保存到vo中,显示数据到页面的时候通常是dto,前几天遇到个坑,在dto中封装实体对象,到控制器调用service进行相关业务操作的时候报错500,错误如下

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No
serializer found for class
org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no
properties discovered to create BeanSerializer (to avoid exception,
disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference

我的DTO如下:
Hibernate 遇到的坑
我当时理解的是懒加载序列化失败,查询了一番说是在原来实体类中加入以**解

@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})

然而并没有什么卵用,依旧报错。后来查询说加上懒加载配置,这个本来我就开启的,用Hibernate的人基本都在properties或者.yml中开启下面这个配置的吧

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

这行代码是开启懒加载 防止no session

然而并没有解决问题,我就想是不是表关系的映射 然后就在实体类中查找原因,发现

 @JoinColumn

Hibernate 遇到的坑

发现这个注解有问题,@JoinColumn用来指定与所操作实体或实体集合相关联的数据库表中的列字段,我立马发现我的DTO里面也set 实体类这个字段了,于是我立马注销然后 运行,艹真的可以了。罪魁祸首是实体类类字段被建立关系的时候无法被解析为Json,控制器一运行就立马销毁了,然后就是500的错误。解决是解决了但是我需要这个字段的数据,那我有该怎么办,我有3个办法第一种就是单独的查询出来,第二种就是获取上下文对象后传给一个新对象接受,这样就就可以提取内容了。 如下

     List<Article> objs = articles.getContent();
        for(Article obj:objs){
        List<comment> lists = obj.getCommentList();
    }

拿到单独的obj对象 然后在复制给一个新的对象进行接收。这样就解决了我的问题。