I have two entities Order and Item with one to many relationship.
Order.java
@Id
@Column(name="id")
private Long id;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Item> items;
Item.java
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id", referencedColumnName = "id")
private Order order;
During update flow, user can add or remove items to the order. I am using spring boot crud repository to update the order as shown below. OrderRequest is the request json for update flow. I have written the code to implement that. But code is sure as hell messy. How can this code be improved. Any suggestions?
Optional<Order> orderFromDb = orderRepo.findById(id);
if(CollectionUtils.isNotEmpty(orderRequest.getItems()))
{
// if there are less items in update request than database
if (orderRequest.getItems().size() < orderFromDb.getItems().size()) {
Set<Long> itemIds = orderRequest.getItems().stream().map(id -> id.getId()).collect(Collectors.toSet());
for (ItemRequest itemRequest : orderRequest.getItems()) {
Iterator<Item> item = orderFromDb.getItems().iterator();
Item i;
while (item.hasNext()) {
i = item.next();
if (!itemIds.contains(i.getId())) {
item.remove();
continue;
}
if (i.getId() == itemRequest.getId()) {
i.setName(itemRequest.getName());
}
}
}
} else {
// if there are more or same items in update request and database
for (ItemRequest itemRequest : orderRequest.getItems()) {
// assuming for newly added items id will not be there(db should generate)
if (itemRequest.getId() == null) {
Item item = new Item();
item.setName(itemRequest.getName());
item.setOrder(orderFromDb);
orderFromDb.getItems().add(item);
continue;
}
for (Item item : orderFromDb.getItems()) {
if (item.getId() == itemRequest.getId()) {
item.setName(request.getName());
}
}
}
}
}
You are not persisting removed item.
you could implement ItemRepository object (extends from CrudRepository) and then delete the item. If you delete item, next time you query Order, your item won't be there.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.