首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JPA在创建后返回嵌套对象- 500内部服务器错误

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

Stack Overflow用户
提问于 2019-04-25 21:11:37
回答 2查看 476关注 0票数 0

我有我的主要目标:

@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中的所有字段都为空。

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

如果我追踪足够多,我会看到:

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

我真的不确定我需要添加什么,这样我才能将完全创建的对象及其对subObj的外键引用返回给用户。

我尝试了Hibernate.initialize(),就像很多帖子所说的那样,但没有成功。

如果它不清楚,它会给我一个这样的回复:

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

JSON 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")

EN

回答 2

Stack Overflow用户

发布于 2019-04-26 13:10:34

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-04-25 21:41:55

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

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="SUB_OBJ_ID")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55850126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档