用户要从列表中选择几个要删除的项目。
我有两个选择,要么传递所选项目的 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/