Angularjs + Spring jpa存储库多对一字段不保存

时间:2015-11-09 05:45:11

标签: angularjs jpa

我正在使用Angularjs,Spring jpa存储库,hibernate。 问题是“无法在订单表中保存客户的ID”。 表名:Order,CustomerGlobal Order表中Customer的引用列名是customerGlobal_id。 订单属于客户。订单表有一个customerGlobal_id字段。

在实体(订单)中,我已经定义了

@ManyToOne(optional = false) @JsonIgnore
CustomerGlobal customerGlobal;

订单属于一个客户。如果我指定JoinColumn,则hibernate会在数据库中生成列。所以,我认为那里没有问题。 我为customerGlobal字段添加了Getter和Setter。

我正在使用JPA存储库,界面定义如下:

public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
...
}

我假设这也可以正常工作。

以下是html的相关部分:

 <select ng-options="convertToInt(customer.id) as customer.name for customer in c" class="form-control " name="customerGlobal" ng-model="req.customerGlobal" required></select>

这是从关联控制器保存的表单的一部分。 c的值是通过加载请求获得的。

[{"id":1,"name":"XYZ","contactPerson":"ABC","mobile":"1111111111","email":"abc@adef.com",}]

这似乎工作正常。我得到了表中客户的下拉列表。

当我保存表单时,customerGlobal_id和其他字段值通过POST发送,但customerGlobal_id不会保存到数据库中。

这似乎不是一个非常具体的问题。这是一个基本的多对一关系,没有得到保存。我对Angularjs并不完全熟悉。所以请帮我解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

为了保存与春假的关系,您不应该使用实体的ID,而应该使用实体的引用URL 。因此,假设您有一个与Car实体关联的Make实体,并且您想要设置汽车的品牌。这是你应该做的:

第1步。得到Make实体:

-get a specific `Make`: localhost:8080/makes/1

-get a a list of `Make`: localhost:8080/makes

并选择您想要的那个:

{
  "name" : "Toyota",
  "country" : "Japan",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/makes/1"
    }
}

第2步。现在插入/更新Car,如下所示:

POST / PUT http://localhost:8080/cars/123

{
  "model" : "Corolla",
  "year" : "2006",
  "hp" : 95,
  "make" : "http://localhost:8080/makes/1"
}

就像这样:

{
  "model" : "Corolla",
  "year" : "2006",
  "hp" : 95,
  "make" : 1
}

Spring Data Rest了解实体的参考网址