我是Spring Boot的新手,我用它来实现rest API。我有一个自引用表,其中每个项目都有一个父树结构-。我已经使用ManyToOne实现了这一点,并且得到了一个拥有父对象的json对象。如果我得到所有物品,由于存在巨大的网络延迟和处理能力,因此速度非常慢,因为我的树最多可以容纳10000个物品。
我该如何使用链接来表示这一点,即json对象包含指向父级的链接和指向子级的链接的数组。我已经读过DTO可以用来实现这一点,但是我没有找到完整的细节。
我的代码的一部分
@Entity
@Table(name = "Item", schema = "dbo")
@Getter
@Setter
public class Item {
@Id
@GeneratedValue
@Column()
private Integer ItemID;
@Column()
private String Project;
@Column()
private String Name;
@Column()
private Integer Version;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ParentItemID", insertable = false, updatable = false)
private Item parentItem;
My controller is strait forward
@Autowired
ItemService ItemService;
@RequestMapping ("/items")
public Iterable<Item> items(@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "20") Integer size, Authentication auth) {
return ItemService.findPaginated(page, size);
}
如果我对如何使用DTO或其他设计获得链接而不是完整对象有更多解释,我将感到高兴。
答案 0 :(得分:0)
最简单的方法是,返回父级和子级ID而不是Item对象。
@Entity
@Table(name = "Item", schema = "dbo")
public class Item {
.
.
private Integer ItemID;
private Integer parentItem;
.
.
在控制器中具有另一个端点,例如/items/{itemId}
@GetMapping("/items/{itemId}")
public Item item(@PathVariable itemId, Authentication auth) {
return ItemService.findById(itemId);
让您的消费者获取父/子ID并进行单独的REST调用
或者,您可以使用Spring-HATEOAS
Spring HATEOAS项目是一个API库,我们可以使用它来 轻松创建遵循以下原则的REST表示 HATEOAS(作为应用程序状态引擎的超文本)。
一般而言,该原则意味着API应该指导 客户通过返回相关的应用程序 有关接下来可能采取的步骤的信息以及每个响应。
更多信息Here