英文:
removing an object of a list from a persisted entity JPA
问题
Optional<Order> orderFromDb = orderRepo.findById(id);
if (CollectionUtils.isNotEmpty(orderRequest.getItems())) {
Set<Long> itemIds = orderRequest.getItems().stream().map(id -> id.getId()).collect(Collectors.toSet());
Iterator<Item> itemIterator = orderFromDb.getItems().iterator();
while (itemIterator.hasNext()) {
Item item = itemIterator.next();
Long itemId = item.getId();
if (!itemIds.contains(itemId)) {
itemIterator.remove();
continue;
}
for (ItemRequest itemRequest : orderRequest.getItems()) {
if (itemId.equals(itemRequest.getId())) {
item.setName(itemRequest.getName());
break;
}
}
}
for (ItemRequest itemRequest : orderRequest.getItems()) {
if (itemRequest.getId() == null) {
Item newItem = new Item();
newItem.setName(itemRequest.getName());
newItem.setOrder(orderFromDb);
orderFromDb.getItems().add(newItem);
}
}
}
英文:
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());
}
}
}
}
}
</details>
# 答案1
**得分**: 0
你没有持久化已移除的项目。
你可以实现一个ItemRepository对象(继承自CrudRepository),然后删除该项目。如果你删除了项目,在下次查询订单时,你的项目将不会出现。
链接:https://www.baeldung.com/spring-data-jpa-delete
<details>
<summary>英文:</summary>
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.
https://www.baeldung.com/spring-data-jpa-delete
</details>
专注分享java语言的经验与见解,让所有开发者获益!
评论