Java 使用Hibernate将嵌套JSON数据保存到MySQL数据库
我被这个问题搞得焦头烂额。我已经为嵌套的JSON创建了一个POJO,我正在Java 使用Hibernate将嵌套JSON数据保存到MySQL数据库,java,mysql,json,spring,hibernate,Java,Mysql,Json,Spring,Hibernate,我被这个问题搞得焦头烂额。我已经为嵌套的JSON创建了一个POJO,我正在MarketPrice对象中获取数据,其中marketPrices是一个ArrayList,它有两个元素 这是MarketPrice POJO类,实际上我需要将其保存到MarketPrice表中。即,整个JSON对象。但我有两个实体。这怎么可能呢 MarketPrice.java @Entity @Table(name = "MarketPrice") public class MarketPrice { @Id @G
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;
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;
@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;
}
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";
}
@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;
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;
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";
}
这是我从控制器服务器端获取的嵌套JSON数据:
市场价格中的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
@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;
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;
@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;
}
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";
}
@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;
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;
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";
}
DAO.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;
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;
@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;
}
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";
}
@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;
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;
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";
}
在对DAO进行这些更改之后,它最终保存了
谢谢。您应该为整个Json ant创建一个更大的实体,它将在onetomany上列出您的marketPrice对象。请阅读该注释。并同时解析整个传入对象,而不仅仅是其中的市场价格列表。您可以在此处阅读如何解析整个对象: 你需要像这样的东西: 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;
@实体
@资料
@表(name=“您的表”)
公共类实体{
//你也应该在这里描述你的参数
//解析后的json。它还有其他数据,不仅仅是“MarketPrices”列表。。。
@OneToMany(mappedBy=“yourEntity”,
cascade={CascadeType.PERSIST,CascadeType.MERGE},
fetch=FetchType.LAZY,OLINDEMOTION=true)
私人标价;
…如评论中所述,您可以按如下方式修改代码,使其按预期工作 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;
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;
@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;
}
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";
}
@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;
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;
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";
}
DAO.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;
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;
@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;
}
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";
}
@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;
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;
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";
}
据我所知,从json到pojo的转换是正确的?此AnalyzerService是您的DAO.java?最后,我认为您不需要为保存每个marketprice创建for循环。保存marketprice对象将在一个实例中保存父对象和子对象(据我所知).但是你需要在MarketPlace和Items类之间创建关系,比如OneToMany,你在两个表之间的映射在哪里,即1到Many?我在回答中描述了我为两个表添加了映射,请检查一下。我添加了以前保存的DB格式。我只需要以该格式保存。即使我也不想要marketPrice列。org.hibernate.TransactionException:事务未成功启动…………并且ITEMS类中的所有列都保存空值我已移动了行
session.getTransaction().commit()
退出for
循环。itemName、unitofPrice、minimumPrice和maxPrice保存为空值根据您的注释确认json是否正确设置为marketPrices
对象//将其转换为实体类型所有值都存在于其中?