通过 REST 调用使用外键将项目添加到集合中

Posted

技术标签:

【中文标题】通过 REST 调用使用外键将项目添加到集合中【英文标题】:add item to the collection with foreign key via REST call 【发布时间】:2016-10-20 13:17:12 【问题描述】:

我有 2 个具有双向关联的 jpa 实体。

拥有项目集合的实体Container (oneToMany) 省略 getter/setter

@javax.persistence.Entity
@Table(name = "CONTAINER")
public class Container implements Serializable 
    private static final long serialVersionUID = -3288335692695653843L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "container", cascade = CascadeType.ALL)
    private List<Item> items;


实体 Item 包含对容器 (ManyToOne) 的引用,带有属性值和日期。 省略 setter/getter

@javax.persistence.Entity
@Table(name = "ITEM")
public class Item implements Serializable 

    private static final long serialVersionUID = -758343957629274274L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Basic
    private Long value;
    @Basic
    private Date date;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "CONTAINER_ID")
    private Container container;

我也在使用 spring-data 存储库来公开数据。

我的接口存储库只是扩展了 CrudRepository&lt;Container, Long&gt;CrudRepository&lt;Item, Long&gt;

@RepositoryRestResource
public interface ItemRepository extends CrudRepository<Item, Long> 


@RepositoryRestResource
public interface ContainerRepository extends CrudRepository<Container, Long> 

我正在尝试通过 REST 调用创建项目。

首先我在项目存储库rest/items上尝试了这个

POST  "value" : 666, "date" : "2016-01-31T23:00:00.000+0000", "container": "id":"1"

但它只是在容器上创建具有空引用的项目。

当我尝试通过容器存储库添加时rest/containers/1/items

POST  "value" : 666, "date" : "2016-01-31T23:00:00.000+0000", "container": "id":"1"

我得到HTTP/1.1 204 No Content&lt;Response body is empty&gt;。没有创建实例。

我的问题是如何通过引用容器的 REST 调用添加项目。

编辑:要指定我的问题,我想为现有容器添加新项目。通过rest(json)创建Item实例时,我不确定如何处理外ID键

【问题讨论】:

【参考方案1】:

我通过使用 json 中容器的链接解决了这个问题。

POST "value" : 666, "date" : "2016-01-31T23:00:00.000+0000","container":"http://localhost:8080/container/1"

我不确定没有spring-data-rest 是否可以工作

编辑:我应该指出,链接资源必须是 @RepositoryRestResource 并且应该是聚合根

【讨论】:

为了将数据保存到数据库中的多对多查找表,应该使用什么 json 进行发布,我无法使用 spring boot data rest 保存具有多对多关系的对象。【参考方案2】:

http 响应状态 204 为无内容。也就是说,您调用的 REST 方法是无效的,即使创建了实例,它也不会返回任何内容。

您确定没有创建实例吗?如果没有,请将代码发布到应该创建它们的位置,以便我们更好地了解发生了什么。

【讨论】:

实例不是通过 POST rest/containers/1/items 创建的 当我 GET /rest/container/items 时,没有列出新实例。当我列出 GET /rest/items 时也没有。 如果没有创建实体的代码,我无法说出问题所在。编辑包含该代码的帖子。

以上是关于通过 REST 调用使用外键将项目添加到集合中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.7 中通过外键将 created_by 和 updated_by 用户添加到 model.py? [复制]

如何通过引用外键将 Django 模型移动到其他应用程序?

Swift 4 通过外键将数组映射到字典

实体框架代码优先 - 通过主键将子实体添加到父实体

使用 spring-data-rest 将资源添加到集合

如果集合尚未通过比较项目的属性将项目添加到集合中?