我正在开发一个 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"
}
]
}
]
}
]
}
]
}
这对我来说是最好的主意吗?
最佳答案
一切都取决于您的要求和情况。 您应该了解以下几件事:
如果您的实体发生变化 - 客户端会同时更新吗?如果是这样,您可以使用您的实体作为 DTO,但这是一个不好的做法,因为您也需要担心客户端。或者,您可以向实体添加一些
@JsonProperty
/@JsonIgnore(ignoreUnknown=true)
注释,以保护自己免受字段名称不匹配或情况的影响,当客户端向您发送一些属性,不属于实体。如果客户独立并且不会改变,例如您将向实体添加新字段 - 您可以创建看起来与实体相似的 DTO(JPA 注释除外)并使用它们。编写一些 utils 映射器,它将从 DTO 获取数据,将它们转换为实体并调用 save() 方法(或者您想对实体执行的任何操作)。但就你而言,因为你有某种树结构 - 这样的映射器会稍微复杂一些。
如果我是你 - 我最好坚持选择 2。它更复杂,需要更多的代码,但将来它将更具可扩展性、灵 active 和易于支持
关于java - 实现 oneToMany 关系的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700494/