我有我的主要对象:
@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;
}
它保存正确,但是当我将其返回给用户(通过 Controller 返回)时,我得到了 500 的返回值。调试后可以看到subObj中的所有字段都为空。
但它实际上创建了 mainObj 并将其放入数据库,只是未能序列化它并返回。
如果我追踪得足够多,我会看到:
No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer
不太确定我需要添加什么,以便我可以将完全创建的对象及其对 subObj 的外键引用返回给用户。
我像很多帖子所说的那样尝试了 Hibernate.initialize() 但没有运气。
如果不清楚,它会返回以下其中之一:
完整的堆栈跟踪(删除了一些细节):
org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS); nested exception is com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.path.to.MainObj["subObj"]-com.path.to.SubObj_$$_jvsta14_f["handler"])
最佳答案
最佳实践是不要直接在 Controller 中返回实体(因为这可能会导致堆栈溢出异常)。该实体应转换为 DTO(数据传输对象)并返回 DTO。
如果您仍然想使用实体,则应该对所有引用(包括引用对象内的引用对象)使用 eager 而不是 lazy ;
关于java - JPA 在创建后返回嵌套对象 - 500 内部服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55850126/