【问题标题】:Spring Boot @ManyToOne only Id @JsonPropertySpring Boot @ManyToOne 仅 ID @JsonProperty
【发布时间】:2020-06-06 23:46:13
【问题描述】:

帮我找到 JSON 属性注释,让我为 JSON 序列化选择一个实体属性。我只需要一个。

我是这样编码的:

@Entity
@Table(name = "pages")
public class Page {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   @Column(name = "id")
   private Long id;

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

   @JsonIgnoreProperties(value = {"name", "description", "pages"}) // it's working, but I want to simplify, I need only project id property to JSON
   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "project_id")
   private Project project;

   //getters and setters
} 

及项目实体:

@Entity
@Table(name = "projects")
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "project_id")
    private Long id;

    @Column(name = "project_name")
    private String name;

    @Column(name = "description")
    private String description;


    @OneToMany(targetEntity = Page.class, mappedBy = "project", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @OrderBy("id")
    private List<Page> pages = new ArrayList<>();
}

而 JSON 应该是:

   {
        "id": 10,
        "name": "Name",
        "project": {"id":1}
   }

【问题讨论】:

  • 欢迎来到 SO!你的问题不清楚。也许您可以包含一个示例 JSON?不确定您要做什么。
  • 谢谢,我包含了项目实体和 JSON。
  • 在类级别的项目中包含 @JsonIgnoreProperties(value = {"name", "description", "pages"})。此外,如果您可以将实体和 dto 分开会更好,它可以使代码更清晰,更好地分离。
  • 除了@Code_Is_Law 建议的内容外,您还可以在要忽略的字段上使用@JsonIgnore 注解。虽然我也会推荐@Code_Is_Law 的解决方案。
  • @Code_Is_Law,我喜欢将实体和 dto 分开的想法。我想了想,我认为这可能就像实现代理模式一样。

标签: json spring-boot spring-data-jpa entity many-to-one


【解决方案1】:

您应该创建一个 DataTransferObject (DTO),而不是使用太多注释。

在 DTO 中,您可以准确定义应该公开哪些信息并将每个实体对象映射到 DTO。这不是返回到前端,而不是实体本身。

这是一个很好的主题教程:https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application

【讨论】:

    【解决方案2】:

    我不会在这里留下空格@GeneratedValue(strategy = GenerationType.IDENTITY) --> @GeneratedValue(策略=GenerationType.IDENTITY)。您确实需要一个控制器和一个使用 @Restcontroller 和 @Service 注释的服务,然后您可以设置一个 @Repository 并且只是“findByID”(存储库实际上没有任何进一步的实现就可以理解这一点)。 ID 可以绑定到 @Pathvariable 并从 URL /Project/{id} 检索值 你可能会做这样的事情,例如

    @RequestMapping(method=RequestMethod.POST, path="project/{id}")
    void addUser(@Pathvariable Long id) {
        ProjectService.delete(id);
    }
    

    试试这个https://www.youtube.com/watch?v=QHjFVajYYHM,就像你正在尝试的一样。

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2021-07-26
      • 2021-08-17
      • 2020-05-26
      • 2021-06-15
      相关资源
      最近更新 更多