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方法时