【问题标题】:removing an object of a list from a persisted entity JPA从持久化实体 JPA 中删除列表的对象
【发布时间】:2020-09-17 07:08:13
【问题描述】:

我有两个实体 OrderItem 具有一对多关系。

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;

在更新流程中,用户可以在订单中添加或删除商品。我正在使用 spring boot 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());
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: java spring-boot jpa


    【解决方案1】:

    您没有保留已删除的项目。

    您可以实现 ItemRepository 对象(从 CrudRepository 扩展),然后删除该项目。如果你删除了item,下次查询Order时,你的item就没有了。

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

    【讨论】:

    • orphanRemoval = true 负责处理。代码工作正常。我已经测试过了。我只是想改进凌乱的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多