Spring Boot - REST POST 请求时仅保存 ID,但 GET 请求时获取对象

Posted

技术标签:

【中文标题】Spring Boot - REST POST 请求时仅保存 ID,但 GET 请求时获取对象【英文标题】:Spring Boot - Save only ID when REST POST request, but get object when GET request 【发布时间】:2016-04-06 00:53:21 【问题描述】:

我正在使用 Spring Boot 构建宁静的 Web 应用程序。我有一个名为“货币”的实体,还有另一个名为“事件”的实体,它们看起来像这样:

@Entity
@Table(name = "currency")
public class Currency 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "title")
    String title;

    public Currency() 
    

    public long getId() 
        return id;
    

    public void setId(long id) 
        this.id = id;
    

    public String getTitle() 
        return title;
    

    public void setTitle(String title) 
        this.title = title;
    

和Event实体(部分列省略):

@Entity
@Table(name = "event")
public class Event 

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(table = "currency", name = "id")
    private Currency currency;

    public Event() 

    public Currency getCurrency() 
        return currency;
    

    public void setCurrency(Currency currency) 
        this.currency = currency;
    

我在货币表中已经有货币(美元、欧元等),我不想在这个表中有任何其他数据,我想在事件表中只有货币的 id,而不是整个对象,所以我如何在 GET-ing 事件时可以设法拥有 Currency 对象(带有货币名称和 id),但在 POST-ing 新事件时仅插入 id?

【问题讨论】:

【参考方案1】:

首先,除非只有一个事件可以与给定货币关联,否则您的映射是错误的:事件和货币之间的关联应该是多对一,而不是单对一:许多事件共享同一种货币。

现在回答你的问题。保存事件时,您会从浏览器收到一些 JSON 对象,其中包含事件信息,包括事件所涉及的货币 ID。所以你需要做的就是获取这个 id 标识的 Currency 实例,然后创建并持久化一个包含该货币的 Event 实例:

Currency currnecy = em.find(Currency.class, currencyId);
// or, if you don't even want to hit the database:
// Currency currnecy = em.getReference(Currency.class, currencyId);

Event event = new Event();
event.setCurrency(currency);
em.persist(event);

【讨论】:

谢谢您的回答,我知道您的回答,但是我应该在哪里获得该代码,我的意思是在控制器中、服务中还是实体中? 这取决于你。对 EntityManager 的访问应该在 DAO/Repository 组件中。我倾向于直接从控制器访问存储库,除非逻辑很复杂和/或由许多控制器共享;在这种情况下,我使用服务。但这不是这里重要的事情。什么代码并不重要。重要的是解决方案的原理:从现有实体的 ID,您可以使用 JPA 获得对实体本身的引用,并将该引用存储在新实体中。 主要问题是它是多对一关系,而不是你说的单对一关系。同样在@JoinColumn 中,名称必须是事件实体中的唯一列名而不是 id(因为发生了冲突)。谢谢。

以上是关于Spring Boot - REST POST 请求时仅保存 ID,但 GET 请求时获取对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postman 表单数据将 POST 请求发送到 Spring Boot REST API?

在 Spring-boot 中成功登录后如何限制 POST Rest Api 以供公共访问

500内部服务器错误;在spring Boot rest api中使用POST方法时

使用 Spring Boot 的多个 REST 调用

Spring Boot - REST POST 请求时仅保存 ID,但 GET 请求时获取对象

Spring Boot REST API 端点映射最佳实践