【发布时间】:2023-03-11 17:17:01
【问题描述】:
我有一个相当复杂的 POJO,我需要从 JSON 字符串反序列化并保存在 MySQL 数据库中。下面是一个非常简化的示例类:
@Entity
@Table(name="a")
public class A{
private Long id;
private B b;
private C c;
private D d;
}
@ManyToOne
@JoinColumn(name="b_id")
public B getB(){
return this.b;
}
public void setB(B b){ this.b = b; }
@ManyToOne
@JoinColumn(name="c_id")
public C getC(){
return this.c;
}
public void setC(C c){ this.c = c; }
@ManyToOne
@JoinColumn(name="d_id")
public D getD(){
return this.d;
}
public void setD(D d){ this.d = d; }
每个类 B、C 和 D 也有许多字段和对象(有些甚至需要更多的对象和字段)根据数据库架构不能为空,我可以' t 改变。我可以反序列化并坚持这个没问题,但是这样做所需的 JSON 真的很大。我只需要保留反序列化的A,所以我真的只需要来自B、C 和D 的_id 字段。
现在我的 JSON 是这样的:
{
"id":1,
"b":{"id":2, ...},
"c":{"id":3, ...},
"d":{"id":4, ...}
}
我必须填写所有不可为空的数据库字段。我想做的是读取一个 JSON 字符串,例如:
{
"id":1,
"b_id":2,
"c_id":3,
"d_id":4
}
只需让 Hibernate/JPA 更新数据库中的这些字段。我认为真正棘手的部分是我的应用程序中的其他类/方法将需要整个对象层次结构才能从数据库中读取。我唯一可以使用 _id 字段的时间是在 JSON 的反序列化期间。在这种情况下,我只需要更新最顶层的对象(在我的示例中为A)和其他一些琐碎的字段。在一个完美的世界里,我可以在我的课堂上添加一些注释来解决这个问题,但我还没有找到任何能够做到这一点的东西。
这甚至可能吗?如果是这样,可以用 JPA/Jackson 注释来完成吗?
谢谢!
【问题讨论】:
-
您可以编写自定义反序列化器并使用
@JsonDeserialize(using = ...) -
我知道自定义反序列化器(我在应用程序的其他地方使用它们)。您能否详细说明这可能如何解决我的问题?
-
好吧,当你反序列化时,你可以访问
JsonParser。而JsonParser可以帮助您获得所需的信息(当前会员姓名等)。 -
你控制传入的 JSON 吗?
-
@Jukka,在某种程度上,是的。另一个开发团队正在编写它并通过 RESTful 调用将其发送到我的应用程序。根据我们无法更改的现有数据库架构,我可以要求他们可能会或可能无法发送给我的某些字段。
标签: java json hibernate jpa jackson