복붙노트

[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. ==============================

    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. ==============================

    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;
    

    .....

  3. from https://stackoverflow.com/questions/43487344/saving-nested-json-data-into-a-mysql-database-using-hibernate by cc-by-sa and MIT license