当前位置: 首页 > 知识库问答 >
问题:

如何创建具有关联的新实体

席安康
2023-03-14

假设我在前面有一个表单,它有常用的字段和下拉列表。在这些下拉列表中,用户可以选择一个选项,并且每个选项都链接到Spring data JPA中的一个实体;

下拉列表包含一些标签和对应实体的链接作为值。然后,这个值在POST-request中传递给我们希望创建的实体的PagingAndSorting存储库。

假设它是一个具有username的用户,并且他必须与其中一个办公室(也是一个实体)关联:

@Data
@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name="users")
public class User{

@Id
@Coluemn(name="USER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;

@Column(name="USER_NAME", nullable=false)
private String userName;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="OFFICE_ID", **nullable=false**)
private Office office;
}

我的第一个猜测是:将post请求发送到http://localhost:8080/api/users/contenttype:'application/json'

{"userName":"Anton","office":"http://localhost:8080/api/offices/1"}

但会引发异常

{
"cause": {
    "cause": null,
    "message": "Cannot construct instance of `test.domain.Office` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/offices/1')\n at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 160] (through reference chain: test.domain.User[\"office\"])"
},
"message": "JSON parse error: Cannot construct instance of `test.domain.Office` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/offices/1'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `test.domain.Office` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://localhost:8080/api/office/1')\n at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 1, column: 160] (through reference chain: test.domain.User[\"office\"])"
}

我做错了什么?

共有1个答案

柳向明
2023-03-14

您将URL资源作为字符串发送,以代替JSON对象,并期望在Spring和jackson之间发生一些神奇的事情来查找值。当然,这不是正在发生的事情,Jackson正在尝试将URL的字符串值绑定到Office字段。这当然失败了,因为它不知道如何从字符串创建Office对象。

一个可能的解决方案是在实体对象(那些代表数据库表的对象)和DTO(数据传输对象)之间进行区分,在这种情况下,DTO代表您与客户端的合同。在执行此操作时,您可以接收如下所示的html" target="_blank">用户对象:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User{

  private Long userId;

  private String userName;

  private Long officeId;

}

现在,您只需发送office id而不是URL,并在代码中使用Spring数据存储库来查找office对象。之后,您可以构造您的实体用户对象,如上面所示,并持久化它。

 类似资料:
  • 如果我只传递一个字符串,而不是的列表: 我得到的是:

  • 问题内容: 用Javascript将是: 但是Python中相同的语法会创建一个字典,那不是我想要的 问题答案: 有两种功能用途。

  • 我正试图阻止我的关系重新开始。我尝试了多种方法来解决这个问题,但似乎每次都有一个错误。例如,当我尝试以下代码时: 我得到以下错误: 我已经检查了数据库中的所有表和索引,但在任何地方都找不到此约束。我该如何移除它。我基本上希望我的模式是这样的: 今年将有一份所有学生、老师的名单。当学生注册时,他们将被添加到该学年中 如果我不添加连接列,我只是得到另一个表说 Year.students 我如何将这些结

  • 那么如何将此更改为jpql查询代码呢?谢谢

  • 我正在尝试使用new关键字创建一个组件的新实例。组件类有另一个类的自动布线。在第一类中,它有一个调用第二类的方法。代码如下: First.java 第二Java语言 一个pplication.java 我能够使用依赖注入来训练解决方案。我只是想这样做。 提亚

  • 问题内容: 假设我有两个表:Store和Product。我希望我的商店有产品清单。我怎样才能做到这一点? 我开始这样的事情,但是我不知道该如何完成,你们能帮我吗? 问题答案: 多对一(产品只能有一家商店) 多对多(产品可以在许多商店中使用)