如何将带有嵌入对象的对象返回到jquery get调用



我使用jquery.get((调用Spring Boot后端,如下所示:

var url = "http://localhost:8080/api/v1/get_holdings?userId=1"; 
$.get(url, function(payload,status) {       
if (status == "success") {
$.each(payload.data, function (key,entry) {
...
})
}
else {...

在SpringBoot中,我创建了一个具有嵌入式模型的模型。在这种情况下,模型称为Holding,嵌入模型称为Account,如下所示:

@Entity
@Table(name="holding")
public class Holding {
...
@ManyToOne  //Many holdings to One Account
@JoinColumn(name="account_id", nullable=false)
private Account account;
...
//getters and setters...

对数据库的调用会正确地返回数据。然后我尝试将其返回到jquery ajax调用,如下所示:

JsonResponse response = new JsonResponse();
List<Holding> holdings = holdingRepo.getUserHoldings(userId);
response.setData(holdings); //response looks correct but browser shows a 500 error.  Why?
return response;

JsonResponse只是我用于所有响应的包装器。我已经用过很多次了,在许多其他电话中都很好:

public class JsonResponse {
private String status = null;
private Object data = null;
//getters and setters...

它返回到浏览器ok,但浏览器给出500错误。

有两种方法可以让浏览器接受数据。

  1. 创建一个单独的模型,该模型只包含我需要的数据,而不包含嵌入的模型
  2. 使用toString((方法手动创建json(痛不欲生(

我曾尝试使用Gson.toJson和JSONArray(holdings(将Holding对象转换为JSON,但这两种方法都失败了。我错过了什么?

您正在使用一个关系。我想会发生一个异常,如下所示:

org.hibernate.LazyInitializationException: could not initialize proxy

这可能是因为Hibernate试图优化性能,而不加载关系中的对象。

那么这个问题在SO上有很多答案。

  1. 一种解决方案可以是强制Hibernate通过
Hibernate.initialize( entity )
  1. 另一种方法可以不是将实体发送到客户端,而是将它们转换为数据传输对象。如果您在事务中进行这样的转换,Hibernate将自动解析所有需要的对象,您将不需要任何技巧

最新更新