【问题标题】:Unique annotation @GeneratedValue唯一注解@GeneratedValue
【发布时间】:2018-03-19 02:41:56
【问题描述】:

我想要做的是添加(POST)具有自动生成ID的资源。 我添加了注释,我的模型看起来像这样

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String brand;

问题是为什么当我发布一些没有 id 的值时:

{
    "brand": "sony"
}

我自动获取 id = 0:

{
    "id": 0,
    "brand": "sony"
}

如果我发布更多资源而不调用 id,它们的 id = 0(所以它不是唯一的)。

我做错了什么?

【问题讨论】:

  • 您使用哪个数据库?
  • 内嵌调用h2

标签: java spring rest annotations crud


【解决方案1】:

我自动获取 id = 0:

那是因为您使用的是primitive data typelong,其默认值为0

如果没有明确分配,这些字段的序列化-反序列化最终会附加原始数据类型的默认值

如果您需要在没有设置值的情况下排除此类字段,您可能打算改用Long(引用类型)。

【讨论】:

  • 在我尝试获取资源时更改 Long 类型会产生错误。 “错误”:“内部服务器错误”,“异常”:“org.springframework.http.converter.HttpMessageNotWritableException”,“消息”:“无法写入内容:(是java.lang.NullPointerException)(通过引用链:java .util.ArrayList[3]->spring.degath.model.Phone[\"id\"]); 嵌套异常是com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (通过引用链: java.util.ArrayList[3]->spring.degath.model.Phone[\"id\"])", "path": "/phones/" }
  • @degath 正如答案中指出的那样您需要排除此类字段的地方是您应该使用Long,然后使用类似于Include.NonNull 的注释标记此类字段。否则您可以继续使用long,默认值为0。它也没有任何危害。进一步取决于您的 API 实现。
  • 哦,我现在明白为什么它是默认值 0,但问题是如何在 POST 请求时获取自动递增的 id(我希望注释 @GeneratedValue(strategy = GenerationType.IDENTITY为我做,但似乎我的想法有误)
  • @degath 好吧,尽管stackoverflow.com/questions/36388919/… 在这种情况下可以为您提供帮助,但问题中没有说明。
  • 非常感谢,我显然接受了您的回答,再次感谢您的宽容。你让我开心:)
猜你喜欢
  • 2019-03-08
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2021-12-12
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
相关资源
最近更新 更多