java.lang.IllegalStateException: múltiples representaciones de la misma entidad con @ManyToMany 3 entidades

Tengo 3 entidades con relaciones ManyToMany como a continuación:

Entidad de rol:

@Entity public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer roleID; private String roleName; private String description; @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) @JoinTable(name = "role_permission", joinColumns = {@JoinColumn(name = "role_id")}, inverseJoinColumns = {@JoinColumn(name = "permission_id")}) private Set permissions = new LinkedHashSet(); 

Entidad de permiso:

  @Entity public class Permission { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int permissionID; private String permissionName; private String description; @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.EAGER) @JoinTable(name = "permission_functionality", joinColumns = {@JoinColumn(name = "permission_id")}, inverseJoinColumns = {@JoinColumn(name = "functionality_id")}) private Set functionalities = new LinkedHashSet(); 

Entidad de Funcionalidad:

  @Entity public class Functionality { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; 

Hice lo siguiente:

  1. He creado 3 funcionalidades.

     functionality1, functionality2, functionality3 
  2. Luego creó 2 permisos como:

     a. Permission 1 with functionality1, functionality2. b. Permission 2 with functionality2, functionality3. 
  3. Luego, al crear un rol como:

     Role 1 with Permission1 and Permission2 iam getting following exception 

    java.lang.IllegalStateException: se combinan varias representaciones de la misma entidad [com.persistence.adity.admin.Functionality # 1]. Independiente: [com.persistence.entity.admin.Functionality@4729256a]; Independiente: [com.persistence.entity.admin.Functionality@56ed25db]

Se corrigió eliminando CascadeType.MERGE en la entidad Permiso

La solución correcta habría sido actualizar a hibernate 4.2.15 / 4.3.6 o superior y agregar las siguientes líneas a su persistence.xml:

Verifique el método equal y hashCode, asegúrese de que sea coherente y esté correctamente definido. Por ejemplo, copié y pegué erróneamente otra clase al calcular hashCode, esto hizo que el objeto nunca fuera igual a sí mismo :(.

En mi caso, mover la operación de búsqueda y guardar la operación en el mismo bloque @Transactional resolvió el problema.

se produce un error cuando tenemos varios objetos de la misma hora en HashSet.Possible debido a la función hash incorrecta. Hashset comprueba la igualdad de objetos en función de la función hash entre dos objetos.

Manera de depurar

Simplemente intente imprimir hashset verá múltiples objetos del mismo tipo.

Solución::#

  • Use HashSet mientras define una a muchas relaciones.
  • Evite usar listas.
  • Asegúrate de que tu función hash sea correcta.

No se pudo agregar un comentario … baja reputación 🙁

Pero la respuesta correcta es la de @ user1523177 – no estoy seguro de por qué no está marcada como la aceptada – https://stackoverflow.com/a/34420512/6914827

Básicamente, son los hash e iguales los que hacen que hibernate se ponga al revés … ¡ CascadeType.MERGE y elimina CascadeType.MERGE no es lo que quieres!

Para Hibernate, vea la solución aquí HHH-9106 .

Solo una nota para decir que estoy usando Hibernate Core 4.3.8 en una aplicación Spring MVC, basada en Spring Core 4.1.6. La solución alternativa:

  

No funcionó para mí Necesitaba eliminar CascadeType.MERGE para completar correctamente @ManyToMany. No estoy seguro de si las versiones más recientes de Hibernate han solucionado esto.