实现一对多关系的最佳实践是什么?

时间:2019-11-04 20:21:03

标签: java hibernate spring-boot jpa

我正在开发一个rest API,该API提供一个端点来插入Rule and Items。我有一个名为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实体来表示该信息,但是我不知道如何ll create this VO's and I don不知道这种方法是否是最好的。 我的第一个想法是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"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

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

1 个答案:

答案 0 :(得分:0)

一切取决于您的要求和情况。 您应该了解以下内容:

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

    < / li>
  2. 如果与客户无关,并且不会更改,例如您将向实体添加新字段-您可以创建看起来像实体的DTO(除了JPA注释之外),并使用它们。编写一些utils映射器,该映射器将从DTO中获取数据,将其转换为实体,然后调用save()方法(或您想对实体执行的任何操作)。但是,根据您的情况,因为您有某种树形结构-这样的映射器会稍微复杂一些。

如果我是您-我最好坚持使用选项2。它更复杂,需要更多代码,但将来它将更具可伸缩性,灵活性和易于支持性