【问题标题】:Post an entity with Spring Data REST which has relations使用具有关系的 Spring Data REST 发布实体
【发布时间】:2017-11-13 19:01:29
【问题描述】:

我正在使用 Spring Data Rest。我在尝试发布具有关联的对象时遇到问题(例如,地址是我实体中的一个字段,它被映射为多对一)。

问题是,我们应该使用什么格式来连接我们的新实体和它的关系。我看到了几个答案并尝试了我找到的所有选项。不幸的是,它们都不适合我。 发生以下错误:

Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ADDRESS_ID"; SQL statement:

我尝试过的 JSON:

{
"name": "test",
"email": "test@email",
"address": "http://localhost:8080/MyApp/address/1"
}

也试过这些:

"address": {"id":"http://localhost:8080/MyApp/address/1"}

还有这个:

"address":{"id":1}

甚至这个:

"address": {
"href": "http://localhost:8080/MyApp/address/1"
}

有没有办法做到这一点,或者只为 POST 编写自己的控制器实现?谢谢!

【问题讨论】:

  • 发布您的实体。
  • 数据库中有哪些语句?您显然正在生成插入
  • 是的,它是 POST 和 insert 语句。地址对象存在,我需要创建另一个实体的新对象,其中地址只是一个关联。
  • 这里,apigility.org/documentation/api-primer/halprimer 我可以看到据说我们只需要使用 ID。但是API应该解决它。但是,它只是 HAL 本身。 Spring 可以采取不同的方式。
  • 如果我发布到以 localhost:8080/MyApp/address/1/persons 开头的 URL,我不需要在请求中指定它并且它可以工作。然而,这并没有帮助。因为我想使用上面提供的端点。

标签: java spring hibernate spring-data-rest


【解决方案1】:

如果你有这样的模型:

@Entity
public class User {
    //..
    private String name;

    @OneToMany(mappedBy = "user")
    private Set<Address> addresses = new HashSet<>();
    //..
}

@Entity
public class Address {
    //..
    @ManyToOne
    private User user;
    //..
}

然后您可以像这样发布一个带有addresses 的新User:

POST http://localhost:8080/api/users
{
    "name" : "user1",
    "addresses" : [
        "http://localhost:8080/api/addresses/1",
        "http://localhost:8080/api/addresses/2"
        ]
}

在 POST 新用户之前,地址 ID#1 和 ID#2 必须已被持久化。

【讨论】:

  • 感谢您的回答!如果用户的地址不是集合怎么办?例如私人地址地址; ?
  • @dvelopp 使用相同的技术:"address": "http://localhost:8080/api/addresses/1"(如果对您有帮助,请不要忘记接受/支持我的回答)。
  • 还是不行。也许与我的整体结构有关。说没有找到身份证。 "地址": "localhost:8080/MyApp/address/1"
  • @dvelopp 看看我的工作examples...
  • 谢谢。这里有很多有用的例子。看来我需要调查 PagedResourcesAssembler 并得出一些结论。在此之前,我将使用我之前提到的“如果我发布到以:localhost:8080/MyApp/address/1/persons 开头的 URL,我不需要在请求中指定它并且它可以工作。但是,那不是帮助。因为我想使用看起来像我上面提供的端点。 – dvelopp昨天“
猜你喜欢
  • 2014-07-09
  • 2015-02-09
  • 2021-08-06
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
相关资源
最近更新 更多