gpt4 book ai didi

java - 使用 JPA/Hibernate 最小化 JSON 以反序列化和持久化复杂的 POJO

转载 作者:行者123 更新时间:2023-12-01 14:29:19 27 4
gpt4 key购买 nike

我有一个相当复杂的 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; }

每个类 BCD 也有许多字段和对象(有些甚至有更多必需的对象和字段)根据数据库架构,它不能为空,我无法更改。我可以反序列化并持久化,这没有问题,但是这样做所需的 JSON 确实很大。我只需要保留反序列化的 A,所以我实际上只需要 BC 中的 _id 字段,和D

现在我的 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注释来完成吗?

谢谢!

最佳答案

如果将 JSON 直接映射到您的实体是不恰当的,我只需通过中间对象(如果愿意,可以将其称为 DTO)将传入的 JSON 字符串显式转换为您的实体。

我还有一种直觉,如果您保存关联的对象引用(@ManyToOnes),而仅填充了 id,Hibernate 实际上会正确保存关联(此处的根对象代表 A):

{
"id" : 1,
"b" : {
"id" : 2
},
...
}

确保不要级联 b、c 等字段的持久操作。

关于java - 使用 JPA/Hibernate 最小化 JSON 以反序列化和持久化复杂的 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16949125/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com