使用Hibernate将嵌套的JSON数据保存到MySQL数据库中

3
我遇到了这个问题。我已经创建了一个用于嵌套JSON的POJO,并在MarketPrice对象中获取数据,其中marketPrices是一个有两个元素的ArrayList
这是MarketPrice POJO类,实际上我需要将它保存到MarketPrice表中。也就是说,整个JSON对象。但我有两个实体。这怎么可能呢? MarketPrice.java
@Entity
@Table(name = "MarketPrice")

public class MarketPrice {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "itemId")
private Long itemId;

@Column(name = "analysisDate")
private Date analysisDate;

@Column(name = "marketName")
private String marketName;

@Column(name = "category")
private String category;

@Column(name = "marketPlace")
private String marketPlace;

@Column(name = "state")
private String state;

@Column(name = "district")
private String district;


public ArrayList<Items> marketPrices;

Items.java

public class Items implements Serializable {

    private static final long serialVersionUID = -2428562977284114465L;

    @Id
    @Column(name="id")
    private int id;

    @Column(name = "itemName")
    private String itemName;

    @Column(name = "unitofPrice")
    private String unitofPrice;

    @Column(name = "minimumPrice",columnDefinition = "Float(10,2)")
    private Float minimumPrice;

    @Column(name = "maximumPrice",columnDefinition = "Float(10,2)")
    private Float maximumPrice;

这是我在控制器端从服务器获取的嵌套JSON数据:

marketPrices中的JSON数据

{
    "marketPrices": [{
        "itemName": "Mango",
        "unitofPrice": "Kg",
        "minimumPrice": "10",
        "maximumPrice": "20"
    }, {
        "itemName": "Grapes",
        "unitofPrice": "Kg",
        "minimumPrice": "30",
        "maximumPrice": "40"
    }],
    "state": "xyz",
    "district": 4,
    "marketPlace": 5001,
    "marketName": "pmc",
    "category": "Fruits"
}

Controller.java

@RequestMapping(value = {"/saveAnalysis"} , method = RequestMethod.POST,consumes = "application/json")
@ResponseBody
public MarketPrice bulkSaveMarketAnalysis(@RequestBody 
        String marketPrices, HttpServletResponse response,
        HttpServletRequest request) throws JsonProcessingException, IOException, JSONException{

    MarketPrice marketPrice1 = new MarketPrice();
    System.out.println("Json Data"+marketPrices);//here am getting valid nested json from UI
    Gson gson = new Gson();
    MarketPrice marketPrice = gson.fromJson(marketPrices, MarketPrice.class);//converting it into Entity type all values are present in it.
    //Am strucked after this,How to save nested json into DB.

    String marketDataResponse =  analyserService.saveListOfMarketPrice(marketPrice);
    marketPrice1.setStatusMessage("success");
    return marketPrice1;
}

DAO.java

public String saveListOfMarketPrice(MarketPrice marketPrice) {
    System.out.println("In Analyser DAO fro bulk saving");
    final Session session = getSession();
    session.beginTransaction();
    marketPrice.setAnalysisDate(new Date());
    for (Items item : marketPrice.marketPrices) {
       marketPrice.currentItem = item;
       marketPrice.setItemName(marketPrice.currentItem.getItemName());
       marketPrice.setUnitofPrice(marketPrice.currentItem.getUnitofPrice());
       marketPrice.setMinimumPrice(marketPrice.currentItem.getMinimumPrice());
       marketPrice.setMaximumPrice(marketPrice.currentItem.getMaximumPrice());
        session.save(marketPrice);
    }
    session.getTransaction().commit();
    session.close();
    return "success";
}

在对DAO进行这些更改后,它终于保存了。谢谢。


据我所知,从JSON到POJO的转换是正确的吗?这个analyserService是你的DAO.java吗?最后,我认为你不需要为保存每个marketprice创建循环。保存marketPrice对象将在一个实例中保存父对象和子对象(据我所知)。 - Ankit
但是您需要创建MarketPlace和Items类之间的关系,例如onetomany。 - Ankit
我在我的回答中已经描述了这个。 - strash
@Aruna,所有细节都应该只保存在MarketPrice表中,所以Items类需要'@Table'注释吗..? - Hema
在这种情况下,您不需要 @ManyToOne 注释。存储 public ArrayList<Items> marketPrices 的列名是什么? - Aruna
显示剩余5条评论
2个回答

1

您应该创建一个更大的实体来表示整个Json,它将拥有您的marketPrice对象@onetomany的列表。了解有关该注释的信息。并且一次解析整个传入对象,而不仅仅是marketPrices列表内的内容。您可以在此处阅读有关如何解析整个对象的信息: GSON解析无需大量类

您需要像这样的东西: JsonObject rootObj = parser.parse(json).getAsJsonObject();

然后,您应该在一个实体中描述该结构:

@Entity
@Data
@Table(name = "your_table")
public class YourEntity{
//you should describe your parameters here too
//of the parsed json. it has other data in it not only the list of `MarketPrices`...


    @OneToMany(mappedBy = "yourEntity",
            cascade = {CascadeType.PERSIST, CascadeType.MERGE},
            fetch = FetchType.LAZY, orphanRemoval = true)
    private List<MarketPrice> prices;

.....


1

如评论中所讨论的,您可以按以下方式修改代码以使其按预期工作。

MarketPrice.java

@Entity
@Table(name = "MarketPrice")

public class MarketPrice {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "itemId")
private Long itemId;

@Column(name = "analysisDate")
private Date analysisDate;

@Column(name = "marketName")
private String marketName;

@Column(name = "category")
private String category;

@Column(name = "marketPlace")
private String marketPlace;

@Column(name = "state")
private String state;

@Column(name = "district")
private String district;

 @Transient
 public Items currentItem;

@Column(name = "itemName")
public String getItemName() {
    return this.currentItem.itemName;
}

@Column(name = "unitofPrice")
public String getUnitofPrice() {
    return this.currentItem.unitofPrice;
}

@Column(name = "minimumPrice",columnDefinition = "Float(10,2)")
public Float getMinimumPrice() {
    return this.currentItem.minimumPrice;
}

@Column(name = "maximumPrice",columnDefinition = "Float(10,2)")
public Float getMaximumPrice() {
    return this.currentItem.maximumPrice;
}

@Transient
public ArrayList<Items> marketPrices;

Items.java

public class Items implements Serializable {

    private static final long serialVersionUID = -2428562977284114465L;

    @Id
    @Column(name="id")
    private int id;

    public String itemName;

    public String unitofPrice;

    public Float minimumPrice;

    public Float maximumPrice;

DAO.java

public String saveListOfMarketPrice(MarketPrice marketPrice) {
        System.out.println("In Analyser DAO fro bulk saving");
        final Session session = getSession();
        session.beginTransaction();
        for (Items item : marketPrice.marketPrices) {
           marketPrice.currentItem = item;
           session.save(marketPrice);
        }
        session.getTransaction().commit();
        session.close();
        return "success";
    }

org.hibernate.TransactionException: 事务未成功启动............并且ITEMS类中的所有列都保存了NULL值。 - Hema
itemName、unitofPrice、minimumPrice 和 maxPrice 正在保存为 NULL 值。 - Hema
你能确认一下JSON是否已经按照你的注释 "//converting it into Entity type all values are present in it" 正确地设置到了 marketPrices 对象中吗? - Aruna
插入到MarketPrice表中(analysisDate, category, district, marketName, marketPlace, state)的值为(?, ?, ?, ?, ?, ?)。这是Hibernate生成的查询,其中没有itemName、unitofPrice、maxPrice和minPrice参数。 - Hema
让我们在聊天中继续这个讨论。 - Hema
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接