es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en el uso del método equals() para verificar si los objetos User son iguales. Por defecto, el método equals() compara objetos basándose en su ubicación en memoria, y dado que el objeto User que se está eliminando es una instancia diferente a la que está en el Set, la eliminación falla.

    Para solucionar esto, necesitas sobrescribir el método equals() en la clase User para comparar basándote en algún identificador único, como el campo id.

    public class User {
        // ...
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof User)) return false;
            User other = (User) o;
            return Objects.equals(id, other.getId());
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
        // ...
    }
    

    Una vez hayas sobrescrito equals() y hashCode(), el método remove() debería ser capaz de identificar correctamente el objeto User a eliminar y eliminarlo del Set de usuarios en cada Group.

Comments are closed.