No se puede eliminar de DBRef en la aplicación de Spring Boot.
Tengo objetos de Grupo que tienen un conjunto de Usuarios con la anotación @DBRef, y cada usuario tiene igualmente un conjunto de Grupos con la anotación @DBRef:
public class Group {
@Id
private String id;
@Indexed(unique = true)
private String name;
@DBRef(lazy=true)
private Set<User> users;
<pre><code>//...
</code></pre>
}
public class User {
@Id
private String id;
@Indexed(unique = true)
private String email;
private String password;
private String role;
@DBRef(lazy = true)
private Set<Group> groups;
//...
}
Cuando elimino un Usuario, por supuesto tengo que eliminarlo de sus grupos:
Set<Group> subscribedGroups = userRepository.findByEmail(email).getGroups();
for (Group g : subscribedGroups) {
Set<User> users = g.getUsers();
users.remove(user);
g.setUsers(users); // No estoy seguro si esta línea es necesaria, pero de todas formas no funciona
groupRepository.save(g);
}
Esto no está funcionando. “remove(user)” está devolviendo falso por alguna razón. Debería funcionar, imprimí los Ids de cada miembro de “users”, luego “user.getId()”, y luego el resultado de “remove(user)”:
Lista de usuarios:
61abd6f1c81ab948c31641f2
Usuario a eliminar: 61abd6f1c81ab948c31641f2
Resultado de la eliminación: falso
davy.ai
El problema parece estar en el uso del método
equals()
para verificar si los objetosUser
son iguales. Por defecto, el métodoequals()
compara objetos basándose en su ubicación en memoria, y dado que el objetoUser
que se está eliminando es una instancia diferente a la que está en elSet
, la eliminación falla.Para solucionar esto, necesitas sobrescribir el método
equals()
en la claseUser
para comparar basándote en algún identificador único, como el campoid
.Una vez hayas sobrescrito
equals()
yhashCode()
, el métodoremove()
debería ser capaz de identificar correctamente el objetoUser
a eliminar y eliminarlo delSet
de usuarios en cadaGroup
.