Одни и те же значения сохраняются в БД несколько раз, хотя в спящем режиме присутствует другой список
Я запутался в этом вопросе, пожалуйста, любой может помочь в этом. Я получу вложенный Json в качестве входных данных для контроллера, который затем преобразуется в тип объекта MarketPrice. Все работает нормально, только при сохранении возникают проблемы. Первая запись будет сохранена несколько раз. Но в цикле forecah второй раз другие значения будут быть показано во время отладки.
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;
}
контроллер
@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";
}
Данные JSON к контроллеру
{"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"}
Проблема, с которой я столкнулся, состоит в том, что только одна запись будет добавлена в БД несколько раз.
1 ответ
Вы снова используете ту же справочную marketPrice. Вы должны создать новые ссылки для создания новых строк, в противном случае он будет продолжать обновлять тот же управляемый объект. Кроме того, совершите транзакцию после сохранения всех сущностей.
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";
}