我有一个相当复杂的 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
也有许多字段和对象(有些甚至有更多必需的对象和字段)根据数据库架构,它不能为空,我无法更改。我可以反序列化并持久化,这没有问题,但是这样做所需的 JSON 确实很大。我只需要保留反序列化的 A
,所以我实际上只需要 B
、C
中的 _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/