Java.lang.Exception illégale: plusieurs représentations de la même entité avec @ManyToMany 3 entités

je vais avoir 3 entités ayant des relations ManyToMany comme ci-dessous:

Entité De Rôle:

    @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<Permission> permissions = new LinkedHashSet<Permission>();

L'Autorisation De L'Entité:

    @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<Functionality> functionalities = new LinkedHashSet<>();

Entité De Fonctionnalité:

    @Entity
public class Functionality {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;

j'ai fait le code suivant:

  1. j'ai créé 3 fonctionnalités.

    functionality1, functionality2, functionality3
    
  2. puis créé 2 permissions comme :

    a. Permission 1 with functionality1, functionality2.
    
    b. Permission 2 with functionality2, functionality3.
    
  3. puis tandis que la création d'un rôle:

    Role 1 with Permission1 and Permission2 iam getting following exception
    

    java.lang.IllegalStateException: représentations Multiples de la même entité [com.persistance.entité.admin.La fonctionnalité n ° 1] est en cours de fusion. Détaché: [com.persistance.entité.admin.La fonctionnalité@4729256a]; Détaché: [com.persistance.entité.admin.La fonctionnalité@56ed25db]

17
demandé sur halfer 2014-10-27 18:52:41

9 réponses

corrigé en supprimant CascadeType.Fusionner sur Permission entity

25
répondu user1188867 2014-10-28 11:22:12

la bonne solution aurait été de passer à la version 4.2.15 / 4.3.6 ou supérieure et d'ajouter les lignes suivantes à votre persistance.xml:

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

18
répondu Suraj Menon 2015-08-24 12:31:27

Vérifiez vos égaux et la méthode de hashCode, assurez-vous qu'elle est cohérente et correctement définie. Par exemple, j'avais copié et collé par erreur une autre classe lors du calcul du hashCode, ce qui a fait que l'objet n'a jamais été égal à lui-même :(.

7
répondu user1523177 2015-12-22 16:39:57

dans mon cas, le déplacement de l'opération fetch et de l'opération save dans le même bloc @Transactional a résolu le problème.

0
répondu Asif Aminur Rashid 2018-05-21 17:42:56

erreur se produit lorsque nous avons plusieurs objets de même temps dans HashSet.Possible en raison d'une fonction de hachage incorrecte.Hashset vérifier l'égalité de l'objet sur la base de la fonction de hachage entre deux objets.

Façon de déboguer

Juste essayer d'imprimer hashset, vous verrez plusieurs objets de même type.

  • utilisez le HashSet tout en définissant une ou plusieurs relations.
  • Évitez d'utiliser des Listes.
  • assurez-vous de votre hachage la fonction doit être correcte.
0
répondu razi 2018-07-28 19:28:20

ne pouvait pas ajouter un commentaire... faible réputation :(

mais la bonne réponse est celle de @user1523177 - Je ne sais pas pourquoi elle n'est pas marquée comme celle acceptée -https://stackoverflow.com/a/34420512/6914827

En Gros, c'est le hachage et les égaux qui font tourner l'hibernation à l'envers...fixer et d'enlever le CascadeType.MERGE n'est pas ce que vous voulez!

0
répondu Ken007 2018-07-31 11:04:40

j'ai rencontré le même problème et résolu d'ajouter un peu de configs dans application.yaml fichiers.

  jpa:
    properties:
      hibernate:
        enable_lazy_load_no_trans: true
        event:
          merge:
            entity_copy_observer: allow

Voir ici Comment maintenir une nouvelle entity contenant plusieurs instances identiques d'une autre entity sans assistance avec spring-boot et JPA?

0
répondu W.Man 2018-09-11 06:35:12

Pour Hibernate voir la solution ici HHH-9106.

-1
répondu user3789608 2015-02-19 16:44:17

juste une note pour dire que j'utilise le noyau D'hibernation 4.3.8 dans une application MVC de printemps, basée sur le noyau de printemps 4.1.6. La solution de contournement:

<property name="hibernate.event.merge.entity_copy_observer" value="allow"/>

N'a pas fonctionné pour moi. J'avais besoin d'enlever le CascadeType.Fusionner afin de bien peupler un @ManyToMany. Je ne sais pas si les nouvelles versions D'hibernation ont corrigé cela.

-1
répondu Beagle 2015-08-30 09:37:47