wake-up-neo.com

java.lang.IllegalStateException: Mehrere Darstellungen derselben Entität mit @ManyToMany 3-Entitäten

Ich habe 3 Entitäten mit ManyToMany-Beziehungen wie folgt:

Rollenentität:

    @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>();

Berechtigungsbehörde:

    @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<>();

Funktionalitätsobjekt:

    @Entity
public class Functionality {

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

Ich habe folgendes gemacht:

  1. Ich habe 3 Funktionalitäten erstellt. 

    functionality1, functionality2, functionality3
    
  2. Dann wurden 2 Berechtigungen erstellt als:

    a. Permission 1 with functionality1, functionality2.
    
    b. Permission 2 with functionality2, functionality3.
    
  3. Dann beim Erstellen einer Rolle als:

    Role 1 with Permission1 and Permission2 iam getting following exception
    

    Java.lang.IllegalStateException: Mehrere Darstellungen derselben Entität [com.persistence.entity.admin.Functionality # 1] werden zusammengeführt. Freistehend: [[email protected]]; Freistehend: [[email protected]56ed25db]

19
user1188867

Behebung des Problems durch Entfernen von CascadeType.MERGE in der Berechtigungsentität

28
user1188867

Die richtige Lösung wäre gewesen, ein Upgrade auf Hibernate 4.2.15/4.3.6 oder höher durchzuführen und die folgenden Zeilen zu Ihrer Persistenz.xml hinzuzufügen:

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

20
Suraj Menon

Überprüfen Sie Ihre equals- und hashCode-Methode und stellen Sie sicher, dass sie konsistent und korrekt definiert sind. Zum Beispiel hatte ich bei der Berechnung von hashCode eine andere Klasse kopiert und fälschlicherweise eingefügt.

8
user1523177

Ich bin auch auf das gleiche Problem gestoßen und habe es gelöst, indem ich ein paar Konfigurationsdateien in application.yaml-Dateien hinzugefügt habe.

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

Siehe hier Wie kann eine neue Entität bestehen bleiben, die mehrere identische Instanzen einer anderen nicht persistenten Entität mit Spring-Boot und JPA enthält?

1
W.Man

Konnte keinen Kommentar hinzufügen ... niedriger Ruf :(

Aber die richtige Antwort ist die von @ user1523177 - nicht sicher, warum sie nicht als akzeptierte markiert ist - https://stackoverflow.com/a/34420512/6914827

Im Grunde ist es das Hash und Equals, das den Hibernate auf den Kopf stellt. Reparieren Sie es und entfernen Sie den CascadeType.MERGE nicht, was Sie wollen!

0
Ken007

fehler tritt auf, wenn in HashSet mehrere Objekte der gleichen Zeit vorhanden sind. Möglicherweise aufgrund falscher Hash-Funktion. Hashset überprüft die Objektgleichheit auf der Grundlage der Hash-Funktion zwischen zwei Objekten.

Weg zum Debuggen

Versuchen Sie einfach, den Hash-Wert zu drucken. Es werden mehrere Objekte desselben Typs angezeigt.

Lösung::#

  • Verwenden Sie HashSet, während Sie eine oder viele Beziehungen definieren.
  • Vermeiden Sie die Verwendung von Listen. 
  • Stellen Sie sicher, dass Ihre Hash-Funktion korrekt ist.
0
razi

In meinem Fall löste das Verschieben des Abrufvorgangs und der Sicherungsvorgang in demselben @Transactional-Block das Problem.

0

Ich könnte es reparieren, indem ich es ersetze 

cascade = CascadeType.All

mit

casecade={CascadeType.PERSIST,CascadeType.REMOVE}
0
Arul Rozario

@LazyCollection (LazyCollectionOption.FALSE  

@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)

@JoinColumn (name = "translate_id")

0
Paul Linux