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:
j'ai créé 3 fonctionnalités.
functionality1, functionality2, functionality3
puis créé 2 permissions comme :
a. Permission 1 with functionality1, functionality2. b. Permission 2 with functionality2, functionality3.
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]
9 réponses
corrigé en supprimant CascadeType.Fusionner sur Permission entity
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"/>
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 :(.
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.
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.
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!
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
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.