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

标签 java json hibernate jpa jackson

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

相关文章:

ios - 如果 json 数组中的某个值返回 null,如何返回下一个非 null json 值?

ruby-on-rails - 尝试使用 RestClient 进行发布或放置;收到 422 错误

oracle - hibernate 序列生成器不一致

java - 如何检查mysql与eclipse的兼容性

java - 有人在嵌入式系统上使用过实时 Java 吗?

JavaFX Hibernate 映射异常

java - JSPX 中的条件 HTML 属性

带有重音/拉丁字符的 JSON 请求

hibernate - 方法在 Grails 应用程序之外使用

java - Jar 输出中的 UTF-8 编码损坏