【发布时间】:2018-02-16 12:15:23
【问题描述】:
我看到了几个类似的问题,但没有一个对我有用的答案。 我正在将现有项目转换为使用 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",
}
}
在我的例子中,Group 对象实际上比这个例子中的要大很多,并且还包含对另一个表的引用(即Group 有一个SomeOtherClass 对象)。我想最终得到如下所示的内容:
{
"user": {
"userId": 1,
"groupId": 3,
"name": "John Doe",
}
}
有没有办法只在我的 JSON 响应中获取 groupId 而不是整个 Group 对象?
我尝试将 FetchType.Lazy 添加到我的 User 类中
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id_user")
private Group group;
但是当我尝试将 User 对象转换为 Json 时,我收到以下错误:
error: Errorjava.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
我发现 this answer 消除了错误,但 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();
【问题讨论】:
-
答案与您提出的另一个相同:将您作为对 REST API 的响应发送的输出与实体分离,一切都会变得更简单。 IE。不要序列化您的实体。序列化表示您的 API 旨在作为响应发送的对象。
-
打扰一下,你说的是 Http Response 吗?
-
@JBNizet 如果我理解正确,您建议不要使用 Gson 将实体转换为 Json,而应该只创建一个新的空 Json 对象并将实体中我需要的所有数据添加到Json 对象并省略我不需要的部分(在此示例中,省略 Group Object 并添加 userId、groupId 和 name)。这可能适用于获取单个小实体,但对于获取更复杂实体的列表,此过程可能会变得更加复杂。似乎应该有一种方法可以按原样转换实体,但用它们的 id 替换子实体。
-
没有。 Gson 是一个对象映射器。创建代表 API 输出的类 (DTO),将实体转换为这些 DTO 类的实例,并使用 Gson 将 DTO 序列化为 JSON。好的 REST 框架会自动为您完成最后一部分。
标签: java json hibernate annotations