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:
Ich habe 3 Funktionalitäten erstellt.
functionality1, functionality2, functionality3
Dann wurden 2 Berechtigungen erstellt als:
a. Permission 1 with functionality1, functionality2.
b. Permission 2 with functionality2, functionality3.
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]
Behebung des Problems durch Entfernen von CascadeType.MERGE in der Berechtigungsentität
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"/>
Ü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.
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
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!
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.
Versuchen Sie einfach, den Hash-Wert zu drucken. Es werden mehrere Objekte desselben Typs angezeigt.
In meinem Fall löste das Verschieben des Abrufvorgangs und der Sicherungsvorgang in demselben @Transactional-Block das Problem.
Ich könnte es reparieren, indem ich es ersetze
cascade = CascadeType.All
mit
casecade={CascadeType.PERSIST,CascadeType.REMOVE}
@LazyCollection (LazyCollectionOption.FALSE
@OneToMany (cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn (name = "translate_id")