从持久化实体中删除列表中的一个对象 JPA。

huangapple 未分类评论48阅读模式
英文:

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=&quot;id&quot;)
private Long id;

@OneToMany(mappedBy = &quot;order&quot;,  cascade = CascadeType.ALL, orphanRemoval = true)
private List&lt;Item&gt; items;

>Item.java

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = &quot;order_id&quot;, referencedColumnName = &quot;id&quot;)
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&lt;Order&gt; orderFromDb = orderRepo.findById(id);

	if(CollectionUtils.isNotEmpty(orderRequest.getItems()))

	{
		// if there are less items in update request than database
		if (orderRequest.getItems().size() &lt; orderFromDb.getItems().size()) {
			Set&lt;Long&gt; itemIds = orderRequest.getItems().stream().map(id -&gt; id.getId()).collect(Collectors.toSet());
			for (ItemRequest itemRequest : orderRequest.getItems()) {
				Iterator&lt;Item&gt; 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&#39;t be there.

https://www.baeldung.com/spring-data-jpa-delete

</details>



huangapple
  • 本文由 发表于 2020年5月30日 00:32:34
  • 转载请务必保留本文链接:https://java.coder-hub.com/62090605.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定