简体   繁体   English

从持久化实体 JPA 中删除列表的 object

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

I have two entities Order and Item with one to many relationship.我有两个具有一对多关系的实体OrderItem

Order.java订购.java

@Id
@Column(name="id")
private Long id;

@OneToMany(mappedBy = "order",  cascade = CascadeType.ALL, orphanRemoval = true)
private List<Item> items;

Item.java 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.我正在使用 spring 引导 crud 存储库来更新命令,如下所示。 OrderRequest is the request json for update flow. OrderRequest 是更新流程的请求 json。 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.您可以实现 ItemRepository object(从 CrudRepository 扩展),然后删除该项目。 If you delete item, next time you query Order, your item won't be there.如果您删除商品,下次查询订单时,您的商品将不存在。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM