Spring MVC,Angular AngularJS下拉列表 - 持久化问题ManyToOne

时间:2015-03-03 11:22:27

标签: angularjs spring hibernate model-view-controller

问题:我有一个Purchase Order表和Country表,其中主键是我的PO表中的外键。在前端,我有一个表单(angularJS),用于创建带有一堆字段的新PO和大约9个下拉列表字段,用户可以在其中选择PO所需的任何信息。 为了示例,我将使用Country下拉列表。 (所有下拉菜单都会从数据库中填充。)

我遇到的问题是持久性。提交表单后,如果我使用调试器并检查传递给服务的Purchase Order对象,则除了属于PO表的其他常规输入字段外,我的所有下拉对象都为空。

我认为问题是Angular,如果我在开发者工具下检查Chrome浏览器中的网络选项卡,我会看到该国家/地区正在传递为 countryData:2 。我是Angular的新手,所以在这个阶段我对如何处理这个问题感到困惑,因为数据来自下拉列表以及我应该如何返回country对象。这里http://tinypic.com/r/2rd9pxl/8我在浏览器中放置了我的网络选项卡的屏幕截图,其中显示了正在发布的数据。

填充国家/地区下拉列表

<div class="control-group">
                      <label class="control-label">*Country</label>
                      <div class="input-append">
                          <div data-ng-init="getCountryDataFromServer()">
                              <b>Person Data:</b> <select id="countryData" ng-model="contact.countryData">
                              <option value="">-- Select Countries --</option>
                              <option data-ng-repeat="country in countries" value="{{country.countryId}}">{{country.countryname}}</option>
                          </select><br>
                          </div>
                      </div>
                      <div class="input-append">
                          <label>
                            <span class="alert alert-error"
                                  ng-show="displayValidationError && newContactForm.countryData.$error.required">
                                <spring:message code="required"/>
                            </span>
                          </label>
                      </div>
                  </div>

模型

@Entity
@Table(name = "PURCHASEORDER",schema = "POTOOL")
@Audited
public class PurchaseOrder {

@Id
@GeneratedValue
private int id;

private String tower;
private Double revenue;
//other properties of the PO

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "country_id")
private Country country;

//Other ManyToOne relationships
//Getter and setters

控制器

@RequestMapping(method = RequestMethod.POST, produces = "application/json")
public ResponseEntity<?> create(@ModelAttribute("contact") PurchaseOrder purchaseOrder,
                                @RequestParam(required = false) String searchFor,
                                @RequestParam(required = false, defaultValue = DEFAULT_PAGE_DISPLAYED_TO_USER) int page,
                                Locale locale) {
    purchaseOrderServiceImpl.save(purchaseOrder);

    if (isSearchActivated(searchFor)) {
        return search(searchFor, page, locale, "message.create.success");
    }

    return createListAllResponse(page, locale, "message.create.success");
}

服务

public void save(PurchaseOrder purchaseOrder) {
    purchaseOrderRepository.save(purchaseOrder);
}

存储库

public interface PurchaseOrderRepository extends
        PagingAndSortingRepository<PurchaseOrder, Integer> {


}

2 个答案:

答案 0 :(得分:1)

我认为因为你已经定义了 ng-model =“contact.countryData”以及选项来自 value =“{{ country.countryId}}“即可。当你提交值country.countryId将去服务器,这绝对没问题。我认为你应该有转换机制,将数据从UI转换为Hibernate Entity(即PurchaseOrder)。通常DTO(数据传输对象)用于从UI获取数据,并使用我们设置为Hibernate实体的setter和getter,后者将保存该实体。 这个问题可能对你有帮助。

DTO to Entity And Entity to DTO

答案 1 :(得分:0)

当您使用HTML(而非使用JSP)时,最好在@RequestBody处使用@ModelAttribute来获取完整的数据体。请参考以下链接: Link 1 Link 2