2017-03-17 189 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