[SPRING] 최대 절전 모드를 사용하여 중첩 된 JSON 데이터를 MySQL 데이터베이스에 저장
SPRING최대 절전 모드를 사용하여 중첩 된 JSON 데이터를 MySQL 데이터베이스에 저장
나는이 문제에 휩싸였다. 중첩 된 JSON을위한 POJO를 만들었고 marketPrices가 두 요소가있는 ArrayList 인 MarketPrice 객체에서 데이터를 가져 왔습니다.
이것은 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 변경 사항을 마친 후에는 결국 저장됩니다. 고맙습니다.
해결법
-
==============================
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"; }
-
==============================
2.Json 전체에 대해 하나의 더 큰 엔티티를 만들어야합니다. 그러면 marketPrice 객체 목록이 생성됩니다. 해당 특수 효과에 대해 읽어보십시오. 또한 들어오는 모든 객체를 한 번에 구문 분석 할 수있을뿐만 아니라 내부의 MarketPrices도 분석 할 수 있습니다. 전체 개체를 구문 분석하는 방법을 읽을 수 있습니다 : 많은 클래스가없는 GSON 파싱
Json 전체에 대해 하나의 더 큰 엔티티를 만들어야합니다. 그러면 marketPrice 객체 목록이 생성됩니다. 해당 특수 효과에 대해 읽어보십시오. 또한 들어오는 모든 객체를 한 번에 구문 분석 할 수있을뿐만 아니라 내부의 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;
.....
from https://stackoverflow.com/questions/43487344/saving-nested-json-data-into-a-mysql-database-using-hibernate by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] [org.thymeleaf.templateresolver.ServletContextTemplateResolver]를 인스턴스화하지 못했습니다 : 기본 생성자가 없습니다 (0) | 2019.04.02 |
---|---|
[SPRING] Pem 인증서가있는 RestTemplate (0) | 2019.04.01 |
[SPRING] IntelliJ IDEA가 잘못된 XSD를 확인합니다. (0) | 2019.04.01 |
[SPRING] 스프링 컨텍스트를로드하지 못한 경우 서버를 중지하는 방법은 무엇입니까? (0) | 2019.04.01 |
[SPRING] Apache-CXF JAX-WS에서 스프링 보안을 사용하는 방법 (0) | 2019.04.01 |