我有我的主要目标:
@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")
发布于 2019-04-26 13:10:34
最佳实践不是直接在控制器中返回实体(因为这可能会导致堆栈溢出流异常)。实体应转换为DTO (数据传输对象)并返回DTO。
如果你仍然想使用entity,你应该对所有的引用(包括引用对象内部的引用对象)使用eager而不是lazy;
发布于 2019-04-25 21:41:55
你能试试这个吗?将此批注添加到SubObj类
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="SUB_OBJ_ID")
https://stackoverflow.com/questions/55850126
复制相似问题