java - 无法将项目列表发送到后端以从列表中删除

标签 java hibernate jakarta-ee hibernate-mapping

用户要从列表中选择几个要删除的项目。

我有两个选择,要么传递所选项目的 ID,要么传递它们在内存中的对象地址。

第一个问题是,发送所选项目的对象而不是它们的 ID 是否正确?

  <input type="checkbox" name="selectedItems" value="${item}"/> 

   rather than

  <input type="checkbox" name="selectedItems" value="${item.id}"/> 

如果我应该发送项目的 ID,当我传递它们的 ID、创建一个对象并设置我无法将它们从列表中删除的 ID 时,最好的方法是什么?

        Item item = new Item();
        item.setID(selectedItems.get(0));

        Basket basket = (Basket) session.get(Basket.class, Long.parseLong(basket_id));
        basket.getItems.remove(item); <<I cant remove them by just setting their ids!!

        session.update(basket);

最佳答案

list.remove方法从列表中删除第一次出现的指定元素。下面的代码块是从 ArrayList 复制的源代码:

for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    // REMOVE ITEM FROM THE LIST
                }
}

它使用 Object.equals方法来检查要从列表中删除的对象的相等性。所以你需要覆盖 equals Item 中的方法类告诉所有items是平等的。当你覆盖 equals() , 你总是需要覆盖 hashCode()所以两种方法是一致的

现在传递 Item 的实例时从 list 中删除, 您需要设置 Item 的所有属性的值用于实现 equals方法。

但是你不应该使用 database identifier (id)实现equals() .在保存实体之前,Hibernate 不会分配标识符值。因此,如果将对象添加到 Set在保存之前,它的哈希码在包含在 Set 中时会发生变化(在保存操作时) , 违背 java.util.Set 的契约(Contract).您可以使用属性组合,这对于 Item 的每个实例都是唯一的.

关于java - 无法将项目列表发送到后端以从列表中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19508156/

相关文章:

java - 为什么区分方法时不考虑返回类型?

java - Hibernate 唯一约束

java - 错误: column is of type bit but expression is of type boolean

java - 在一定时间范围内读取数组

java - 我的 List<> 返回 0 而不是结果

java - 如何从存储在 ArrayList 中的方法返回 toString 方法

java - 如何在Wildfly中设置两只耳朵的部署顺序

java - 如何在Hibernate中选择索引列?

java - Hibernate 或 TopLink 的替代品?

java - Apache TomEE - 无法访问 "TomEE GUI"、 "Server Status"、 "Manager App"和 "Host Manager"服务