Hibernate Spring:一次插入多个条目

时间:2015-08-06 10:23:20

标签: java hibernate jsp spring-mvc

目前我正在努力解决以下问题:

我有一个程序可以保存有关电表及其读数的信息。 我想创建一个表单,我可以在其中一次插入所有已注册仪表的所有读数。 我目前陷入困境:

这是我的控制器:

@RequestMapping("/registerEnergyReading")
public ModelAndView registerEnergyReading(@ModelAttribute("reading") Reading reading, BindingResult result) {
    List<ElectricityMeter> meters= meterService.getMeterList();
    Map<String, Object> model = new HashMap<String, Object>();
    model.put("meters", meters);
    System.out.println("Register Form");
    return new ModelAndView("RegisterEnergyReading", "model", model);}

现在,jsp文件将根据有多少米动态创建一个表。 这将通过&lt; c:forEach items =“$ {meters}”var =“meters”&gt;

但对我来说棘手的部分是如何传递这些多个条目以保存下一个控制器?这里应该使用什么形式?

@RequestMapping("/saveReadings")
     public ModelAndView saveReadings(
     @ModelAttribute("reading") List<Reading> reading, BindingResult result) {
    for(Reading i:reading) {
     readingService.saveReading(i);
    }
     return new ModelAndView("redirect:/najemcaLista.html");
     }

我在这里正确的方向吗?

感谢您的帮助, 马切伊

我得到了一点,但卡住了。

我的控制器现在看起来:

@RequestMapping("/registerEnergyReading")
    public ModelAndView registerEnergyReading(
             @ModelAttribute("listReadingModel") ListReadingModel listReadingModel, BindingResult result) {
        List<EnergyMeter> energyMetersList= meterService.getMeters();

        List<EnergyReading> readings= new ArrayList<EnergyReading>();

        for (int i = 0; i < energyList.size(); i++) {
            EnergyReading reading= new EnergyReading ();
            reading.setMeter(energyList.get(i));
            readings.add(reading);
        }
        listReadingModel.setEnergyReadings(readings);
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("energyMetersList", energyMetersList);
        model.put("readings", readings);
        return new ModelAndView("registerEnergyReading", "model", model);
    }

    @RequestMapping("/saveEnergyReading")
    public ModelAndView saveEnergyReading(
            @ModelAttribute("listReadingModel") ListReadingModel listReadingModel, BindingResult result) {

        List<EnergyMeter> energyMetersList=listReadingModel.getEnergyReadings()
        for (EnergyReading i : reading) {
            readingService.saveReading(i);
        }

        return new ModelAndView("redirect:/energyReadingsList.html");
    }

这是我的视图文件:

<c:url var="listReadingModel" value="listReadingModel.html" />
<form:form id="listReadingModel" modelAttribute="listReadingModel" method="post" action="${listReadingModel}">

<table width="400px" height="150px">

<c:forEach items="${model.readings}" var="readings">
<tr>
<td>${readings.meter.description}</td>
<td><form:label path="${readingValue}">Reading Value</form:label></td>
<td><form:input path="${readingValue}" /></td>
<td><form:label path="${readingDate}">date</form:label></td>
<td><form:input type="date" path="${readingDate}" /></td>
</tr>
</c:forEach>
<tr>
<td colspan="6"><input type="submit" value="Save" /></td>
</table>
        </form:form>

当我在浏览器中打开页面时,它看起来都很好(应该有尽可能多的字段)但是当我按下“save”时,我得到了java.lang.NullPointerException。似乎表单没有将listReadingModel传递给控制器​​。任何想法如何解决?任何拼写错误的应用。代码用不同的语言,所以我在旅途中翻译它。

问候,Maciej

1 个答案:

答案 0 :(得分:0)

如果我理解你的话,我认为你需要的是创建一个包装类

public class ListReadingModel {

    private List<Reading> readings;

    // Getter, setter
}

然后在您的registerEnergyReading方法下,将此ListReadingModel添加到您的Model中。

ListReadingModel listReadingModel = new ListReadingModel ();
model.put("listReadingModel", listReadingModel);

您可以将ListReadingModel绑定到jsp文件中的表单元素。

<form:form method="POST" commandName="listReadingModel">
// add meters and readings here

提交你的jsp后,你可以这样打电话给你的控制器:

@RequestMapping("/saveReadings")
public ModelAndView saveReadings(
    @ModelAttribute("listReadingModel") ListReadingModel listReadingModel , BindingResult result) {

    List<Reading> reading = listReadingModel.getReadings();
    for(Reading i:reading) {
         readingService.saveReading(i);
    }

    return new ModelAndView("redirect:/najemcaLista.html");
}

这可行,但我没试过。您可以在Google上搜索命名包装类以查找更多信息。