我正在开发一个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"
}
]
}
]
}
]
}
]
}
这对我来说是最好的主意吗?
答案 0 :(得分:0)
一切取决于您的要求和情况。 您应该了解以下内容:
如果您的实体中发生某些变化,客户端会在同一时间更新吗?如果是这样,您可以将您的实体用作DTO,但这是一个不好的做法,因为您也需要担心客户端。或者,当客户向您发送一些不在实体中的属性时,可以向您的实体添加一些@JsonProperty
/ @JsonIgnore(ignoreUnknown=true)
批注,以保护自己免受字段名称不匹配或情况的影响。
如果与客户无关,并且不会更改,例如您将向实体添加新字段-您可以创建看起来像实体的DTO(除了JPA注释之外),并使用它们。编写一些utils映射器,该映射器将从DTO中获取数据,将其转换为实体,然后调用save()方法(或您想对实体执行的任何操作)。但是,根据您的情况,因为您有某种树形结构-这样的映射器会稍微复杂一些。
如果我是您-我最好坚持使用选项2。它更复杂,需要更多代码,但将来它将更具可伸缩性,灵活性和易于支持性