当前位置: 首页 > 知识库问答 >
问题:

Hibernate和Jackson

邓韬
2023-03-14

我正在做一个项目,使用Hibernate和Jackson来序列化我的对象。我想我理解它是如何工作的,但我无法让它工作。

如果我理解得很好,只要关系获取模式设置为LAZY,如果你想要这个关系,你就必须初始化它。

这是我的课:

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(schema="MDDI_ADMIN", name = "MINIUSINE")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class MiniUsine {

    @Id
    @Column(name="MINIUSINEID", nullable = false)
    private int miniUsineID;

    @Column(name = "NAME", length = 40, nullable = false)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name="FluxID")
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Set<Flux> fluxs = new HashSet<Flux>();

还有所有的能手和二传手。

我也试过这个jsonclude。包括非空作为类注释。还尝试了非空。然而,杰克逊一直派我去

com.fasterxml.jackson.databind.JsonMappingException:延迟初始化角色集合失败:MiniUsine.fluxs,没有会话或会话被关闭(通过引用链:java.util.ArrayList[0]-

我正在用:mapper对其进行序列化。writeValueAsString(optMU)

使用Jackson 2.3.2

谢谢你的帮助


共有2个答案

钮刚洁
2023-03-14

据我所知,hibernate返回的实体对象是派生自您的实体类的代理。如果您尝试在事务之外访问惰性字段的getter方法,您会得到LazyLaunalizationException。我想说的是将Fluxs设置为空集对您一点帮助都没有。

private Set<Flux> fluxs = new HashSet<Flux>();

Hibernate会使getter过载,如果您试图在事务之外访问它(jackson正在执行此操作以检查它是否为空),则会出现LazyInit错误。

端木承业
2023-03-14

我知道这是一个老问题,但我也有同样的问题。

必须添加一个新的maven依赖项,以支持Hibernate的JSON序列化和反序列化。我使用了Hibernate5,所以我添加了

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.9.2</version>
</dependency>

现在注册新模块。

@Provider
public class JacksonHibernateProvider implements ContextResolver<ObjectMapper> {

    @Override
    public ObjectMapper getContext(final Class<?> type) {
        final ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Hibernate5Module());
        return mapper;
    }
}
 类似资料:
  • 是否可以使用Hibernate ORM和OGM创建单个应用程序?我创建了一个应用程序,我在一个应用程序中遇到了多个JPA的问题。我通过更改两个JPA的名称解决了这个问题,但两个JPA之间仍然存在冲突。以下是例外情况: 原因:org.springframework.beans.factory.无法将类型[org.hibernate.internal.SessionFactoryImpl]的参数值转换

  • 问题内容: 我有一个包含其他两个具有@ManyToOne关系的实体的实体。 如果我尝试保存一个具有另一个A记录的“ B_ID”和“ C_ID”的A实例,则会出现异常: org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联 例如: B_ID和C_ID在我的模型中不是唯一的,并且(B_ID + C_ID)不是唯一的约束! 我能做什么?

  • 问题内容: 我如何获得Spring来从中加载Hibernate的属性? 我们正在使用Spring和JPA(以Hibernate作为实现)。Spring 指定了JPA语言和Hibernate属性: 在这种配置中,Spring通过applicationContext.xml读取所有的Hibernate属性。当我创建一个(位于我的类路径的根,与META- INF处于同一级别)时,Hibernate根本不

  • 问题内容: 目前,我正在使用Spring Web服务,hibernate和JAXb进行项目。 1)我使用IDE的“hibernate代码生成”生成了hibernatebean, 2)另外,我已经使用maven编译器生成了jaxb bean。 .. 现在,我的问题是 1)这是正确的方法吗?(有那么多豆子)。 2)我应该使用JAXb bean来处理到服务层吗?如何使各层解耦? 3)或者,我是否需要创建

  • 问题内容: 如果有什么问题请指正。 现在,当我们将Spring DAO用于ORM模板时,当我们使用@Transactional属性时,从外部而不是在方法内部调用该方法时,我们将无法控制事务和/或会话。 延迟加载可节省资源-减少对数据库的查询,减少将所有集合保持在应用程序内存中的内存。 因此,如果lazy = false,则在链接集中有10,000条记录的情况下,所有相关联的集合都将被提取,这并不是

  • 问题内容: 我们都知道使用Hibernate时的默认行为-它使实际数据库序列增加 一 ,将该值乘以50(默认值)-然后将该值用作实体ID。 这是错误的行为,并与说明以下内容的规范冲突: distributionSize-(可选)从序列中分配序列号时要增加的数量。 需要明确的是:我不关心生成的ID之间的差距。 我关心与基础数据库序列 不一致的 ID 。例如:任何其他应用程序(例如,使用纯JDBC)可