2017-04-20 2 views
0

Je suis fauché avec ce problème, S'il vous plaît tout le monde peut aider à ce sujet. Je vais emboîter JSON comme entrée pour le contrôleur, qui est ensuite converti en type d'objet MarketPrice.Tout fonctionne correctement, Seulement lors de la sauvegarde suis face problème.Le premier enregistrement sera enregistré plusieurs fois.Mais dans la boucle de la deuxième fois une autre valeurs sera montré pendant le débogage.Les mêmes valeurs sont enregistrées dans DB plusieurs fois, même si une autre liste est présente dans hibernate

MarketPrice.java

@Entity 
@Table(name = "MarketPrice") 
public class MarketPrice { 

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

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

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

@Transient 
public Items currentItem; 

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

@Column(name="minimumPrice") 
private Float minimumPrice; 

@Column(name="maximumPrice") 
private Float maximumPrice; 
} 

Items.java

public class Items implements Serializable { 

    private static final long serialVersionUID = -2428562977284114465L; 

    public String itemName; 
    public Float minimumPrice; 
    public Float maximumPrice; 
} 

contrôleur

@RequestMapping(value = {"/save"} , 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(); 
    Gson gson = new Gson(); 
    MarketPrice marketPrice = gson.fromJson(marketPrices, MarketPrice.class); 
    if(marketPrice.getState() != null){ 
    String marketDataResponse = analyserService.saveListOfMarketPrice(marketPrice); 
    System.out.println(marketDataResponse); 
    return marketPrice1; 
} 

DAO.java

public String saveListOfMarketPrice(MarketPrice marketPrice) { 
    final Session session = getSession(); 
    Transaction tx = 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); 
     tx.commit(); 
     } 
    session.close(); 
    return "success"; 
} 

données JSON contrôleur

{"marketPrices":[{"itemName":"Grapes","unitofPrice":"Kg","minimumPrice":"11","maximumPrice":"22"},{"itemName":"Mango","unitofPrice":"Quintal","minimumPrice":"55","maximumPrice":"66"}],"state":"xyz","district":4,"marketPlace":5001,"marketName":"Apmc","category":"Fruits"} 

question ici est fais face à un seul enregistrement sera ajouté dans DB à plusieurs reprises.

Répondre

2

Vous utilisez de nouveau le même marché de référence. Vous devez créer de nouvelles références afin de créer de nouvelles lignes sinon il continuera à mettre à jour cette même entité gérée. En outre, validez votre transaction après avoir sauvegardé toutes les entités.

public String saveListOfMarketPrice(MarketPrice marketPrice) { 
    final Session session = getSession(); 
    Transaction tx = session.beginTransaction(); 

    for (Items item : marketPrice.marketPrices) { 
     MarketPrice marketPriceToSaveInDBAsNewRow = new MarketPrice(); 
     marketPriceToSaveInDBAsNewRow.setAnalysisDate(new Date()); 
     marketPriceToSaveInDBAsNewRow.currentItem = item; 
     marketPriceToSaveInDBAsNewRow.setItemName(marketPriceToSaveInDBAsNewRow.currentItem.getItemName()); 
     marketPriceToSaveInDBAsNewRow.setUnitofPrice(marketPriceToSaveInDBAsNewRow.currentItem.getUnitofPrice()); 
     marketPriceToSaveInDBAsNewRow.setMinimumPrice(marketPriceToSaveInDBAsNewRow.currentItem.getMinimumPrice()); 
     marketPriceToSaveInDBAsNewRow.setMaximumPrice(marketPriceToSaveInDBAsNewRow.currentItem.getMaximumPrice()); 
     session.save(marketPriceToSaveInDBAsNewRow); 

     } 
    tx.commit(); 
    session.close(); 
    //session.getTransaction().commit(); 
    return "success"; 
} 
+0

Il s'agit d'une nouvelle variable créée dans chaque boucle. Le nom de la variable décrit son utilisation. –

+0

Lors de l'utilisation de cette variable sauf les variables currentItem, toutes sont définies sur null qui sont dans l'objet marketPrice – Hema

+0

Les deux sont identiques. Édité –