无法使用杰克逊和休眠序列化 Lazy 获取的对象



我们有一个现有的数据库,我们开始使用Java中的hibernate为它创建Entites我们正在使用 Play 构建一个 Web 应用程序!框架,因此我们使用 Jackson 将我们的对象序列化和反序列化到客户端和从客户端反序列化我们的对象。在一个函数中,我们向数据库查询实体列表(例如报告(,问题是即使我们显式指定了 Eager 获取,某些属性也被延迟获取,这会导致使用 jackson 序列化出现问题,因为它不知道如何处理 Lazy 获取的对象。

例外:

找不到 class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 的序列化程序,也没有发现创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS( (通过引用链:xxxxxxxx(

解释:

//Our current situation is:
//We have a class report and a class user
Class Reprot{
    [join and fetch eager]
    User user;
}
Class User{
    String firstName;
    String lastName;
}
//And we query a list of Reports:
List<Report> list = typedQuery.getResultList();
//When we try to serialze it:
JsonNode jn = Json.toJson(list);
//it throws the above exception

从我们发现的情况来看,问题在于hibernate使用缓存(一级缓存(,因此它不必一次又一次地从数据库中获取内容,这可能是它的作用,因为每个用户可以有多个报告。因此,它所做的是查询列表,当它看到当前报告的用户已经从数据库中获取时,它会放置一个代理而不是实例,并且该代理被视为无法序列化的 Lazy 对象。

我们寻找解决方案,但找不到,希望这里的任何人都可以帮助我们。

您可以通过几种方式处理这种情况。我知道所有的解决方案都是艰难而耗时的。

  1. 不要将实体直接发送到客户端。而是创建实体的副本 (pojo(,>将实体值映射到这些新创建的 pojo,>将其返回给客户端。有一堆或库可以帮助您自动映射类似的对象。在互联网上搜索。

  2. 添加杰克逊@Jsonignore批注以忽略您不需要的属性。

最新更新