设置remove()函数不起作用

cha*_*owa 7 java jpa eclipselink

在使用我的应用程序时,我在尝试从java集合中删除对象时遇到了问题(使用EclipseLink从数据库中提取集合).我想要在具有覆盖等于方法的实体类中删除的对象.我甚至用下面的代码检查了集合中的任何对象是否是我要删除的对象的eqauls:

for(AlbumEntity entity : deleteGroup.getAlbums()){
    System.out.println("VAL: " + deleteAlbum.equals(entity));
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,返回的值之一为true.但是,如果我这样做:

boolean result = deleteGroup.getAlbums().remove(deleteAlbum);
Run Code Online (Sandbox Code Playgroud)

值为resultfalse,集合大小保持不变.

感谢您的帮助

编辑:

@Override
public int hashCode() {
    int hash = 0;
    hash += (id != null ? id.hashCode() : 0);
    return hash;
}

@Override
    public boolean equals(Object object) {
        if (!(object instanceof AlbumEntity)) {
            return false;
        }
        AlbumEntity other = (AlbumEntity) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

一些可能性:

1)id的equals或hashCode方法的实现存在问题。在这种情况下,您可以使用id1.equals(id2)but id1.hashCode() != id2.hashCode()。这将导致专辑对象的equals和hashCode()之间不一致,并可能导致您看到的症状。

2)一个或多个专辑的ID在for循环之后的某个点更改,该循环检查deleteAlbum.equals(entity)集合中的每个专辑。如果专辑的ID更改,则remove()方法可能找不到它。如果将ID保存到数据库,则ID可能会从null更改为某些非null值-EclipseLink可能会为您执行此操作而无需您明确要求。

3)由于EclipseLink的干预,当您运行代码时,deleteGroup实际上可能不是HashSet。EclipseLink文档建议它会为您提供一个“间接对象”,而不是您的类中声明的java.util.Set(或我假定的java.util.HashSet),具体取决于它的配置方式。在这种情况下,contains和remove方法可能无法达到您的期望。

有关这些问题以及其他可能导致Sets异常行为的问题,请参见Java中的覆盖equals和hashCode,以获取有关这些问题以及其他可能的问题的更多详细信息。


Kub*_*tny 2

好吧,让我们尝试一些测试:

1:

Iterator<AlbumEntity> it = deleteGroup.getAlbums().iterator();    
while(it.hasNext()){
    AlbumEntity entity = it.next();
    Assert.assertTrue(deleteGroup.getAlbums().contains(entity))
}
Run Code Online (Sandbox Code Playgroud)

这个测试运行成功吗?