Какова наилучшая практика для реализации отношений OneToMany? - PullRequest
0 голосов
/ 04 ноября 2019

Я разрабатываю 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 для представления этой информации, но я не знаю, как я знаю, является ли этот подход лучшим. Моя первая идея заключается в том, что сущность «Правило» отправляет всю информацию, например:

{
    "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 голосов
/ 06 ноября 2019

Все зависит от ваших требований и ситуации. Вы должны понимать следующее:

  1. Если что-то изменится в ваших сущностях - будет ли клиент обновляться в то же время? Если это так, вы можете использовать свою сущность в качестве DTO, но это плохая практика, потому что вам нужно беспокоиться и о клиентской стороне. Или вы можете добавить к своим сущностям некоторые @JsonProperty / @JsonIgnore(ignoreUnknown=true) аннотации, чтобы обезопасить себя от несоответствия имен полей или ситуаций, когда клиент прислал вам какое-то свойство, которого нет у сущности.

  2. Если клиент независим и не будет изменен, если, например, вы добавите новое поле в сущность - вы можете создать DTO, которые выглядят как сущности для сущности, кроме аннотаций JPA и использовать их. Напишите несколько утилитарных карт, которые будут принимать данные из DTO, преобразовывать их в сущности и вызывать метод save () (или все, что вы хотите делать со своими сущностями). Но в вашем случае, потому что у вас есть какая-то древовидная структура - такой картограф будет немного сложнее.

Если бы я был вами - я бы лучше придерживался варианта 2. Он более сложный, требует немного больше кода, но в будущем он будет более масштабируемым, гибким и простым в поддержке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...