2017-03-17 30 views
3

我發佈的代碼片段工作正常,值保存到數據庫中。但實際上我需要的是一次保存行列表一次。如何使用Angularjs實現更新每一行。希望任何人都可以幫助我解決這個問題。對UI視圖使用Angular js,Spring,休眠節省大量的行

參考鏈路

https://www.codeproject.com/Tips/1028442/Bulk-Upload-in-AngularJS

analysis.html

<select ng-model="analysis.state" ng-options="state.stateName as state.stateName for state in stateList" x-ng-change="updateDistrict(analysis.state)"> 
<option value="">Select State</option> 
</select> 
<select ng-model="analysis.itemName" ng-options="product.itemName as product.itemName for product in itemList"> 
<option value="">Select Item</option> 
</select> 

<input name="minimumPrice" ng-model="analysis.minimumPrice" placeholder="Minimum Price" required /> 
<input name="maximumPrice" ng-model="analysis.maximumPrice" placeholder="Maximum Price" required /> 
<input type="submit" name="Submit" class="btn btn-primary" value="Submit" /> 

saveController.js

scope.saveAnalysis = function(analysis) { 
    Repository.saveAnalysis(analysis) 
     .then(function(response) { 
       var status = response.statusMessage; 
        if (status = "success") { 
         alert("Record added successfully....!!"); 
         state.go('analyserhome'); 
         } else { 
         alert("Details Saving Fail...!!") 
         state.go("home"); 
       } 
      }); 
     }; 

Repository.js 新添加的代碼

this.saveAnalysis = function(analysis){ 

var defer = $q.defer(); 
//defer is units of work,promise is data from those defer 
rootScope.marketPrice = [{ 
    "itemName" : "xyz", 
    "minimumPrice" : "111", 
    "maximumPrice" : "222", 
    "marketName":"xyz", 
    "unitofPrice":"xyz", 
    "category":"xyz", 
    "marketPlace":"xyz", 
    "state":"xyz", 
    "district":"xyz" 
},{ 
    "itemName" : "xyz", 
    "minimumPrice" : "555", 
    "maximumPrice" : "666", 
    "marketName":"xyz", 
    "unitofPrice":"xyz", 
    "category":"xyz", 
    "marketPlace":"xyz", 
    "state":"xyz", 
    "district":"xyz" 
}]; 
var analysisPromise = http.post('/project/saveAnalysis/',rootScope.marketPrice); 

analysisPromise.then(function(response){ 
    analysis =response.data; 
    defer.resolve(analysis); 
}); 
return defer.promise; 

};

Price.java

public class MarketPrice { 

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

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

@Column(name = "minimumPrice",columnDefinition = "Float(10,2)") 
private Float minimumPrice; 

@Column(name = "maximumPrice",columnDefinition = "Float(10,2)") 
private Float maximumPrice; 

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

//getters and setters 

}

SaveAnalysis.java //變化我已經在控制器做出

@RequestMapping(value = {"/saveAnalysis"} , method = RequestMethod.POST) 
@ResponseBody 
public MarketPrice bulkSaveMarketAnalysis(@RequestBody 
     List<MarketPrice> marketPrices, HttpServletResponse response, 
     HttpServletRequest request){ 

    MarketPrice marketPrice1 = new MarketPrice(); 
    System.out.println("List data:"+marketPrices.get(0)+""+marketPrices); 
    String marketDataResponse = analyserService.saveListOfMarketPrice(marketPrices); 
    System.out.println(marketDataResponse); 
    marketPrice1.setStatusMessage("success"); 
    return marketPrice1; 
} 

} 

SaveAnalysisDAO.java

public String saveListOfMarketPrice(List<MarketPrice> marketPrices) { 
    System.out.println("In Analyser DAO fro bulk saving"); 
    final Session session = getSession(); 
    session.beginTransaction(); 
    for (MarketPrice price : marketPrices) { 
     System.out.println("In save method using for each loop"); 
     session.save(price); 
     session.getTransaction().commit(); 
     return "success"; 
    } 
    return null; 
} 

當用戶輸入他的所有數據,整個列表應該保存到數據庫。但這裏的狀態將被選擇一次將被更新到每一行。

更改2個記錄的列表正在傳遞給控制器​​。並且只有一條記錄保存到數據庫中。即每個循環只執行一次。

主要問題,現在面臨的數值應來自HTML頁面

謝謝提前。

+0

因此,您正在創建批量更新查詢(而不是執行它)並保存傳遞的MarketPRice。沒有調用批量更新內容,應該在批量更新後調用保存嗎? –

回答

2

您可以重構大容量更新解決方案的後端。


前端

在您的前端應用程序,創建一個包含MarketPrices列表的有效的JSON。

E.g.的有效的對象 - >

var analysis = [ 
    { 
     "state": "A", 
     "itemName": "Test#1", 
     "minimumPrice": 11.2, 
     "maximumPrice": 10.2 
    }, 
    { 
     "state": "A", 
     "itemName": "Test#2", 
     "minimumPrice": 11.2, 
     "maximumPrice": 10.2 
    }, 
    { 
     "state": "A", 
     "itemName": "Test#3", 
     "minimumPrice": 11.2, 
     "maximumPrice": 10.2 
    } 
]; 

發送包含MarketPrices的陣列一個JSON對你的信息請求主體(數據)。

庫段

saveAnalysis = function(analysis) { 
    $http({ 
     url: 'request-url', 
     method: 'POST', 
     data: analysis 
     }) 
    .then(function(response) { 
    //HANDLE success 
    }, function(errorResponse) { 
    //HANDLE error 
    }); 
}; 

後端

創建接收MarketPrice的列表控制器上的新方法。

SaveAnalysis

@RequestMapping(value = {"/bulkSsaveAnalysis"} , method = RequestMethod.POST) 
@ResponseBody 
public Response bulkSaveMarketAnalysis(@RequestBody List<MarketPrice> marketPrices, HttpServletResponse response, HttpServletRequest request) 

服務層:

隔離您的驗證方法(如果存在的話),所以你可以重用它的單個對象或列表。然後,創建一個接收列表並在數據庫上逐一創建新行的新方法。

for(MarketPrice price : martketPrices) { 
    //call your validation or helpers methods 
    //Here you have to choose what to do on fail scenario 
    saveAnalysisDAO.saveMarketPrice(price); 
} 

有這個設計的一個問題:當任何一個交易失敗會發生什麼?你應該回滾所有人嗎?你應該存儲錯誤併發送一個新的列表,其中包括哪一個失敗,誰成功到前端?

您必須選擇對您的應用程序進行錯誤處理的最佳方案。

+0

謝謝你的回答。我怎樣才能將前端代碼更改爲準確接收列表對象。根據您的答案,我已更改服務器端代碼。 – Hema

+0

你好@Hema,我已經編輯了答案,並增加了一個例子來說明如何改變前端的代碼。希望它清楚你的疑惑。 – Bruno