当前位置: 首页 > 知识库问答 >
问题:

如何在JSON响应中只获得一个实体id而不是整个实体

酆奇文
2023-03-14

我看到了几个类似的问题,但没有一个对我有效的答案。我正致力于将一个现有的项目转换为使用Hibernate。我正在使用Mysql作为数据库。我有一节课是这样的:

@Entity
@Table(name = "user")
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "user_id")
   private Long userId;

   @ManyToOne
   @JoinColumn(name = "group_id_user")
   private Group group;

   @Column(name = "name")
   private String name;

   ...
   // getters and setters....   
}

像这样的类:

@Entity
@Table(name = "group")
public class Group {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "group_id")
   private Long groupId;

   @Column(name="group_name")
   private String groupName;

   ...
   // getters and setters....   
}

当我从数据库中获取user项时,我将其转换为JSON,最后得到如下格式的结果:

{
    "user": {
        "userId": 1,
        "group": {
            "groupId": 3,
            "groupName": "Group Three",

        },
        "name": "John Doe",
     }
}
{
    "user": {
        "userId": 1,
        "groupId": 3,
        "name": "John Doe",
     }
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id_user")
private Group group;
error: Errorjava.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?

我找到了这个消除错误的答案,但是JSON对象与我添加fetchtype.lazy之前完全相同。在某种程度上,转换到JSON会添加fetchtype.lazy忽略的值。

我使用转换到JSON的方法如下:

GsonBuilder b = new GsonBuilder();
Gson gson = b.create();
//b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY);  

com.google.gson.JsonArray jsonArray = gson.toJsonTree(out).getAsJsonArray();

共有1个答案

须峰
2023-03-14

如果我错了,请纠正我,因为我是新冬眠的。根据我到目前为止的经验,是的,可以只发送对象ID,而不是发送整个对象细节作为响应。通过使用@JSONIdentityReference@JSONIdentityInfo,在这里查找文档

下面是为我工作的示例代码:

小组班

@Entity
@Table(name = "group")
public class Group {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "group_id")
   private Long groupId;

   @Column(name="group_name")
   private String groupName;

   ...
   // getters and setters....   
}
@Entity
@Table(name = "user")
public class User {

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "user_id")
   private Long userId;

   @ManyToOne
   @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "group_id")
   @JsonIdentityReference(alwaysAsId = true)
   @JoinColumn(name = "group_id_user")
   private Group group; 
   ...
   // getters and setters....   
}
ObjectMapper mapper = new ObjectMapper();
try {
      json = mapper.writeValue(user);
} catch (JsonProcessingException e) {
      e.printStackTrace();
}
 类似资料:
  • 我想获取用于登录自定义拦截器的HttpServletACK返回内容。开发环境是Spring Boot 1.5.6Java8 Embeded Tomcat 8.0.35,返回内容是RESTful接口json string。这是我获取超文本传输协议响应内容的代码: 当响应json较短时,代码运行良好。但当返回的json太长时,responseContent只包含部分响应内容,在登录之前解析内容失败(需

  • 你的开发者必须力求在项目的公共论坛中以一个单独的参与者出现,而不是一个单独的公司。这不是因为作为一个公司出现本身固有的一些负面含义(好的,或许有一些,但那不是本书所讨论的)。而是因为开源项目的结构配备只能处理个人实体。一个单独的贡献者可以讨论、提交补丁、获取信誉、表决等等。而一个公司不能。 此外,因为分布式的行为方式,你避免了对于刺激性中央集权的敌对。让你的开发者在邮件列表中意见并不一致。鼓励他们

  • 所以我在使用DerbyDB,并建立了一些实体。我有一个,它被用作某些实体的超类()。更具体地说,我有一个超类和3个子类,即、和。现在我有了一个不同的实体,比如说,它应该引用(作为其字段之一)它的所有者。所以我创建了一个名为的字段。我得到的错误是: 有变通办法吗?

  • 问题内容: 我正在发出HTTP请求并侦听“数据”: 问题在于响应是分块的,因此“数据”只是发送回的一部分内容。 我如何将全身退回? 问题答案:

  • 在JPA(Hibernate)中,当我们自动生成ID字段时,假设用户不知道这个密钥。因此,在获取实体时,用户将基于ID以外的某些字段进行查询。在这种情况下,我们如何获取实体(因为无法使用)。 我知道我们可以稍后使用查询并过滤结果。但是,有没有更直接的方法(因为这是我所理解的一个非常普遍的问题)。