Gson与Hibernate结合使用会出现的问题

在使用Hibernate查询数据时,由于延迟加载机制,多对一或多对多关系的实体属性可能未加载完全。当使用Gson转换实体时,这会导致属性丢失并引发错误。为解决此问题,可以利用GsonBuilder结合注解忽略未加载的属性,例如忽略'books'属性,仅保留'id'属性进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Hibernate来查找数据的时候,会因为延迟加载的问题,导致读取到的实体类不是一个完整的实体,如配置了多对一或多对多的映射的时候,对应的一方不会随之加载,而是在用到的时候去加载,这就导致用Gson转化实体类的时候,无法获取其属性,出现错误:

java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: 
org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?    
at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:67) 

解决方法如下:

使用Gson的GsonBuilder构造方法,并利用注解忽略不需要的属性。

如:

<span style="font-size:18px;">@Expose

private int id;

private List books;</span>


这样Gson在转换的时候就会将books属性忽略掉,只输出id属性。

<span style="font-size:18px;">GsonBuilder builder = new GsonBuilder();

builder.excludeFiledWithoutExponseAnnotation();

Gson gson = builder.create();

String result = gson.toJson(object);</span>

但是还有一个问题没有弄清楚,就是如果确实需要关联对象的时候,这种方法就不能使用了,需要一个代理类的转换方法,暂时还不会,以后再写。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值