【问题标题】:What is the best practice to implement oneToMany relationship?实施 oneToMany 关系的最佳实践是什么?
【发布时间】:2019-11-04 20:21:03
【问题描述】:

我正在开发一个提供端点以插入规则和项目的休息 API。我有一个名为 rule 的实体和另一个名为 item 的实体,如下所示:

Rule.java

@Getter
@Setter
@Entity
@Table(name = "rule")
public class Rule extends PhysicalBaseEntity {

    @NotNull
    @Column(name = "title")
    @Size(max = 100)
    private String title;

    @NotNull
    @Column(name = "description")
    @Size(max = 150)
    private String description;

    @OneToMany(cascade = {CascadeType.MERGE}, orphanRemoval = true)
    @JoinColumn(name = "rule_id", nullable = false)
    private Set<Item> items;

}

Item.java

@Getter
@Setter
@Entity
@Table(name = "item")
public class Item extends PhysicalBaseEntity {

    @NotNull
    @Column(name = "code")
    @Size(max = 50)
    private String code;

    @NotNull
    @Column(name = "description")
    @Size(max = 150)
    private String description;

    @ManyToOne(cascade={CascadeType.ALL})
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    private Item parent;

    @OneToMany(mappedBy="parent", cascade={CascadeType.ALL})
    private Set<Item> children;

}

我需要使用 VO 实体来表示该信息,但我不知道 Ill create this VO's and I dont 如何知道这种方法是否是最好的。 我的第一个想法是 Rule 实体发送所有信息,如下所示:

{
    "id": "55cfd101-3bc3-4842-a1ab-f88096b9ea06",
    "title": "TITLE",
    "description": "DESCRIPTION",
    "items": [
        {
            "id": "fa1c8e5f-5791-491b-b1ee-4d09048608d6",
            "code": "2",
            "description": "PARENT",
            "children": [
                {
                    "id": "755bed57-1581-4524-bae1-4ec648711a88",
                    "code": "000",
                    "description": "FIRST SON"
                    "children": [
                        {
                            "id": "1420ad3b-5278-48fe-a638-77a2e16feb39",
                            "code": "111",
                            "description": "SECOND SON"
                            "children": [
                                {
                                    "id": "f55cf8d1-b2e4-4a9e-9f79-df156a5ac0a4",
                                    "code": "222",
                                    "description": "THIRD SON"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

这对我来说是不是最好的主意?

【问题讨论】:

    标签: java hibernate spring-boot jpa


    【解决方案1】:

    一切都取决于您的要求和情况。 你应该明白接下来的事情:

    1. 如果您的实体发生变化 - 客户端会同时更新吗?如果是这样,您可以将您的实体用作 DTO,但这是一种不好的做法,因为您也需要担心客户端。或者您可以在您的实体中添加一些 @JsonProperty/@JsonIgnore(ignoreUnknown=true) 注释,以防止当客户端向您发送一些不在实体中的属性时,字段名称不匹配或出现这种情况。

    2. 如果客户端独立并且不会更改,例如您将向实体添加新字段 - 您可以创建与实体相似的 DTO,但 JPA 注释除外并使用它们。编写一些实用程序映射器,它将从 DTO 获取数据,将它们转换为实体并调用 save() 方法(或您想对实体执行的任何操作)。但在你的情况下,因为你有某种树结构 - 这样的映射器会有点复杂。

    如果我是你,我最好坚持使用选项 2。它更复杂,需要更多代码,但将来它会更可扩展、更灵活且易于支持

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 1970-01-01
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-02-23
      相关资源
      最近更新 更多