【问题标题】:How to persist @OneToMany and @ManyToOne from Json如何从 Json 中坚持 @OneToMany 和 @ManyToOne
【发布时间】:2020-04-27 13:04:34
【问题描述】:

我有下一个 JSON:

{   
    "name": "String",
    "time": int,
    "serve": int,
    "type": "String",
    "about": "String",
    "userId": int,
    "food": [{
        "main_id": long
        "name_Id": int,
        "size": int,
        "measure": "String",
        "foodImgId": int

    },
    {
        "main_id": long
        "name_Id": int,
        "size": int,
        "measure": "String",
           "foodImgId": int 
    }, ... ],
    "steps": [{
        "main_id": long
        "step_id": int,
        "step": "String",
        "stepImgId": int

    },
    {
        "main_id": long
        "step_id": int,
        "step": "String",
        "img": int
    }, ... ],
    "img": [{
        "main_id": long
        "foodImgId": int,
        "stepImgId": int,
        "imgLink": "String"

    },
    {
        "main_id": long
        "foodImgId": int,
        "stepImgId": int,
        "imgLink": "String"
    }, ... ],
}

以及此 JSON 的下一个模型:

@Entity
@Table(name = "MAIN")
public class Main implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    @Column(name = "TIME", nullable = false)
    private int time;

    @Column(name = "SERVE", nullable = false)
    private int serve;

    @Column(name = "TYPE", nullable = false)
    private String type;

    @Column(name = "ABOUT", nullable = false)
    private String about;

    @Column(name = "USER_ID", nullable = false)
    private int userId;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "main_id", orphanRemoval = true)
    private Set<Food> food;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "main_id", orphanRemoval = true)
    private Set<Steps> steps;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "main_id", orphanRemoval = true)
    private Set<Image> img;

// setter & getter

}

@Entity
@Table(name = "STEPS")
public class Steps implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "MAIN_ID", updatable = false)
    public Main main_id;

    @Column(name = "STEP_ID", nullable = false)
    public int step_id;

    @Column(name = "STEP", nullable = false)
    public String step;

    @OneToOne(optional = false)
    @JoinColumn(name = "stepImgId", nullable = true)
    public Image stepImgId;

    // setter & getter

}

@Entity
@Table(name = "IMAGE")
public class Image implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    @JoinColumn(name = "MAIN_ID", nullable = false)
    private Main main_id;

    @OneToOne(optional = false, mappedBy="foodImgId")
    @Column(name = "foodImgId", nullable = true)
    private Food food;

    @OneToOne(optional = false, mappedBy="cookStepId")
    @Column(name = "stepImgId", nullable = true)
    private CookStep cookStepId;

    @Column(name = "ImgLink", nullable = false)
    private String imgLink;

    // setter & getter

}

@Entity
@Table(name = "FOOD")
public class Food implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "MAIN_ID", nullable = false)
    private Main main_idain_;

    @Column(name = "NAME_ID", nullable = false)
    private int nameId;

    @Column(name = "SIZE", nullable = false)
    private int size;

    @Column(name = "MEASURE", nullable = false)
    private String measure;

    @Column(name = "foodImgId", nullable = true)
    private int foodImgId;
    // setter & getter

}

我的问题。如何将该 JSON 保存到数据库? Main_id,在每个模型中,必须有来自 Main 类的 id。 我有一个空的存储库,因为我尝试使用默认方法 repo.save(My_JSON) 保存数据,但我无法从主类接收 id。我需要任何想法,因为我没有足够的 spring-boot 经验。

【问题讨论】:

  • 食物和步骤中的“主要”类型是否有输入错误?这似乎是“食谱”类。除此之外,要解决的主要问题是您的数据不是树,因为 Image 类复制了现有的 Food 和 Step 对象(对于那些想要直接阅读的人)
  • Pdem,当我尝试通过 JPA 保存该 JSON 时,我收到错误什么 main_id 在内部结构(食物、步骤或图像)中为空。我如何使用 JPA 将数据保存到 SQL DB。 PS:是的,我在写问题时犯了一些错误。现在,我修复它。

标签: java json spring one-to-many many-to-one


【解决方案1】:

好的,伙计们,我找到了解决方案。我的问题是我无法得到我需要的回应。我犯了一个巨大的错误。我进行了双向连接并收到了循环和空字段。最后我的实体看下一个。我只会展示发生了什么变化。 主要是:

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "RECIPE_ID", referencedColumnName = "ID")
    private Set<FoodEntity> foodEntity;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "RECIPE_ID", referencedColumnName = "ID")
    private Set<stepEntity> stepEntity;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "RECIPE_ID", referencedColumnName = "ID")
    private Set<ImageEntity> imageEntity;

在另一个实体中,我删除了注释 @ManyToOne 并只留下了我定义变量的行(但它不需要在任何地方)需要查询的地方。

【讨论】:

    【解决方案2】:

    我在 SprinBoot 中使用 Hibernate 运行您的示例,所以我建议在 Food 换行的类

    private Main main_idain_
    

    private Main main_id
    

    这就是我遇到的错误。

    【讨论】:

      【解决方案3】:

      试试这个:

       @JsonBackReference  // add this to prevent Jackson (json) infinite recursion problem
      @ManyToOne(fetch = FetchType.LAZY)
      @JoinColumn(name="MAIN_ID", referencedColumnName = "main_id" ,updatable = false,insertable = false)
      public Main main_id;
      

      您可能忘记添加referencedColumnName,它是数据库中相应列的名称。

      【讨论】:

      • 我没试过使用注解@JsonBackReference。可能对我有帮助吗?
      • 请让我知道它是否有效。我花了很长时间才找到@JasonBackReference 注释。为什么选择 FetchType.EAGER ?
      • Magdalena,我使用 FetchType.EAGER 因为我需要数据库中的所有数据。不幸的是,你的方式对我不起作用。我的 food.main_id 仍然为空。
      • 您使用的是哪个数据库?
      • 这并不重要,但命名一个表 MAIN 的有趣选择。它可能不会与正在运行的应用程序中的方法 public static void main (...) 冲突,但会造成混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多