在一个对象上获取hibernateproxy

chhqkbe1  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我在SpringBootAPI工作。这是我第一次遇到这个问题。
我通过存储库的findbyid函数加载不同的公司对象。所有公司对象都加载正确,只有一个除外。这一个加载javassistlazyinitalizer类型的处理程序属性。其余属性均为默认值。在目标节点的handler对象中,是否正确加载了我想要的对象。
所以我发现这是一种hibernate延迟加载,因为当我想用getter访问属性时,它工作正常。

**我的问题是,我想在最后用gson序列化对象,在序列化过程中出现以下错误:

尝试序列化java.lang.class:org.hibernate.proxy.hibernateproxy。忘记注册类型适配器?
我明白为什么会发生这种错误。但是我不明白为什么只有一个不同的company对象被加载为lazy(或者是hibernateproxy)那么,避免hibernateproxy分别序列化对象的最聪明的方法是什么呢
感谢您的回答:)

llmtgqce

llmtgqce1#

原因可能是您对正确加载的对象执行了一些操作。例如,如果调用加载的持久类的任何方法(不需要getter),hibernate将初始化所有代理。
对加载错误的对象不做任何处理。

o4hqfura

o4hqfura2#

这个适配器是我的解决方案。

public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> {

public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
    @Override
    @SuppressWarnings("unchecked")
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null);
    }
};
private final Gson context;

private HibernateProxyTypeAdapter(Gson context) {
    this.context = context;
}

@Override
public HibernateProxy read(JsonReader in) throws IOException {
    throw new UnsupportedOperationException("Not supported");
}

@SuppressWarnings({"rawtypes", "unchecked"})
@Override
public void write(JsonWriter out, HibernateProxy value) throws IOException {
    if (value == null) {
        out.nullValue();
        return;
    }
    // Retrieve the original (not proxy) class
    Class<?> baseType = Hibernate.getClass(value);
    // Get the TypeAdapter of the original class, to delegate the serialization
    TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType));
    // Get a filled instance of the original class
    Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer()
            .getImplementation();
    // Serialize the value
    delegate.write(out, unproxiedValue);
}

}
您必须将其添加到gsonbuilder中。

new GsonBuilder().registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY).create();

此问题的答案无法序列化对象,原因是hibernateproxy

相关问题