java - 实现 oneToMany 关系的最佳实践是什么?

标签 java hibernate spring-boot jpa

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

规则.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;

}

项目.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 实体来表示该信息,但我不知道如何创建此 VO,也不知道这种方法是否是最好的。 我的第一个想法是规则实体发送所有信息,如下所示:

{
    "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"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

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

最佳答案

一切都取决于您的要求和情况。 您应该了解以下几件事:

  1. 如果您的实体发生变化 - 客户端会同时更新吗?如果是这样,您可以使用您的实体作为 DTO,但这是一个不好的做法,因为您也需要担心客户端。或者,您可以向实体添加一些 @JsonProperty/@JsonIgnore(ignoreUnknown=true) 注释,以保护自己免受字段名称不匹配或情况的影响,当客户端向您发送一些属性,不属于实体。

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

如果我是你 - 我最好坚持选择 2。它更复杂,需要更多的代码,但将来它将更具可扩展性、灵 active 和易于支持

关于java - 实现 oneToMany 关系的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700494/

相关文章:

java - FileWriter 不写入 .txt 文件

java - 单独的接口(interface)和实现 emf ecore

java - FXMLLoader 未从 JUnitTest 加载(相对路径问题)

hibernate - 哪些 Grails 插件不能与 Hibernate 4 插件一起使用?

maven - 在Maven项目中使用gradle-ospackage-plugin

java - 如何使用maven多模块springboot告诉spring从自定义目录加载资源

java - 如何在 Spring 创建所有带有 Flyway 的模型?

java - 实现更有效的矩阵 - 使用数组数组(二维)或一维数组?

java - java真的支持矩形数组吗?如果不是,java 中调用的非锯齿状数组是什么?

hibernate - 按修订日期查询 Hibernate Envers 修订