JPA在创建后返回嵌套对象 - 500内部服务器错误

问题描述 投票:0回答:2

我有我的主要对象:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = MAIN_OBJ)
public class MainObj {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MAIN_OBJ_ID", unique = true, nullable = false)
    private Integer manObjId;

    @ManyToOne
    @JoinColumn(name = "SUB_OBJ_ID", referencedColumnName = "SUB_OBJ_ID", nullable = false)
    @NotNull
    private SubObj subObj;

}

它是子对象:

@Data
@Entity
@EqualsAndHashCode(callSuper = false)
@Table(name = SUB_OBJ)
public class SubObj {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "SUB_OBJ_ID", unique = true, nullable = false)
    private Integer subObjId;

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

}

当我做一个创作:

@Override
@Transactional
public MainObj create(MainObj mainObj) {
    MainObj createdMainObj = mainObjRepository.save(mainObj);
    return createdMainObj;
}

它可以正常保存但是当我将它返回给用户时(通过控制器返回)我得到500回。调试后,我可以看到subObj中的所有字段都为null。

但它确实创建了mainObj并将其放入db中,它只是无法序列化并返回。

如果我追踪它,我看到:

没有找到类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer的序列化程序

不确定我需要添加什么,所以我可以将完全创建的对象返回给用户的subObj的外键引用。

我试过Hibernate.initialize()就像很多帖子说但没有运气。

如果不清楚它会给我一个回复:

enter image description here

完整堆栈跟踪(删除了一些细节):

org.springframework.http.converter.HttpMessageNotWritableException:无法编写JSON:没有为类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer找到序列化程序,也没有发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:没有为类org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer找到序列化器,也没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链) :com.path.to.MainObj [“subObj”] - com.path.to.SubObj _ $$ _ jvsta14_f [“handler”])

java spring hibernate jpa
2个回答
0
投票

你能试试吗?将此批注添加到SubObj类

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="SUB_OBJ_ID")

0
投票

最佳实践是不直接在控制器中返回实体(因为它可能导致堆栈溢出异常)。实体应转换为DTO(数据传输对象)并返回DTO。

如果你仍然想使用实体,你应该对所有引用使用eager而不是lazy(包括引用对象内的引用对象);

© www.soinside.com 2019 - 2024. All rights reserved.