簡體   English   中英

從持久化實體 JPA 中刪除列表的 object

[英]removing an object of a list from a persisted entity JPA

我有兩個具有一對多關系的實體OrderItem

訂購.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;

在更新流程期間,用戶可以向訂單添加或刪除項目。 我正在使用 spring 引導 crud 存儲庫來更新命令,如下所示。 OrderRequest 是更新流程的請求 json。 我已經編寫了代碼來實現它。 但是代碼肯定是一團糟。 如何改進此代碼。 有什么建議么?

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());
                    }
                }
            }
        }
    }

您沒有保留已刪除的項目。

您可以實現 ItemRepository object(從 CrudRepository 擴展),然后刪除該項目。 如果您刪除商品,下次查詢訂單時,您的商品將不存在。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM