java.lang.IllegalStateException: Multiple representations of the same entity with @ManyToMany 3 entities

JavaHibernateJpaJpa 2.0Ejb 3.0

Java Problem Overview


I have 3 entities with ManyToMany relationships:

Role Entity:

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

Permission Entity:

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

Functionality Entity:

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

I did the following:

  1. I have created 3 functionalities:

    Functionality1, Functionality2, Functionality3
    
  2. Then created 2 permissions:

    Permission1 with Functionality1, Functionality2
    
    Permission2 with Functionality2, Functionality3
    
  3. Then created a role:

    Role1 with Permission1 and Permission2 
    

I am getting the following exception:

> java.lang.IllegalStateException: Multiple representations of the same entity [com.persistence.entity.admin.Functionality#1] are being merged. Detached: [com.persistence.entity.admin.Functionality@4729256a]; Detached: [com.persistence.entity.admin.Functionality@56ed25db]

Java Solutions


Solution 1 - Java

Fixed it by removing CascadeType.MERGE on Permission entity

Solution 2 - Java

The correct solution would have been to upgrade to hibernate 4.2.15 / 4.3.6 or above and add the following lines to your persistence.xml:

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

Solution 3 - Java

Check your equals and hashCode method, ensure that it is consistent and correctly defined. For example I had copied and mistakenly pasted another-class when computing hashCode, this caused the object never to be equal with itself :(.

Solution 4 - Java

Like others who based their answers on HHH-9106 but, because I'm using Spring Boot with Java-based annotation, I had to use the following in application.properties:

spring.jpa.properties.hibernate.event.merge.entity_copy_observer=allow

Solution 5 - Java

I ran into the same problem too and solved it by add a few configs in application.yaml files.

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

See it here How to persist a new entity containing multiple identical instances of another unpersisted entity with spring-boot and JPA?

Solution 6 - Java

I could fix it by replacing

cascade = CascadeType.All

with

casecade={CascadeType.PERSIST,CascadeType.REMOVE}

Solution 7 - Java

For Hibernate see the workaround here [HHH-9106][1].

[1]: https://hibernate.atlassian.net/browse/HHH-9106 "HHH-9106"

Solution 8 - Java

In my case, moving the fetch operation and save operation in same @Transactional block solved the problem.

Solution 9 - Java

error occurs when we have multiple object of same time in HashSet.Possible due to incorrect hash function.Hashset check equality of object on the basis of hash function between two objects.

Way to debug

Just try to print hashset you will see multiple object of same type.

Solution::#

  • Use HashSet while defining one to many relationships.
  • Avoid using Lists.
  • Make sure your hash function should be correct.

Solution 10 - Java

**@LazyCollection(LazyCollectionOption.FALSE** 

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

@JoinColumn(name = "translate_id")

Solution 11 - Java

I fixed this issue by removing cascade = CascadeType.ALL in your case (cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})

My code source:

Before

@ManyToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
    name = "link_module_parcour",
    joinColumns = {@JoinColumn(name = "module_id", referencedColumnName = "id")},
    inverseJoinColumns = {@JoinColumn(name = "parcour_id", referencedColumnName = "id")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Parcour> parcours = new HashSet<>();

After

@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
    name = "link_module_parcour",
    joinColumns = {@JoinColumn(name = "module_id", referencedColumnName = "id")},
    inverseJoinColumns = {@JoinColumn(name = "parcour_id", referencedColumnName = "id")})
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@BatchSize(size = 20)
private Set<Parcour> parcours = new HashSet<>();

Solution 12 - Java

Just a note to say I am using Hibernate Core 4.3.8 in a Spring MVC application, based on Spring Core 4.1.6. The workaround:

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

Did not work for me. I needed to remove the CascadeType.MERGE in order to correctly populate an @ManyToMany. Not sure if newer versions of Hibernate have fixed this.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1188867View Question on Stackoverflow
Solution 1 - Javauser1188867View Answer on Stackoverflow
Solution 2 - JavaSuraj MenonView Answer on Stackoverflow
Solution 3 - Javauser1523177View Answer on Stackoverflow
Solution 4 - JavaGuiRitterView Answer on Stackoverflow
Solution 5 - JavaW.ManView Answer on Stackoverflow
Solution 6 - JavaArul RozarioView Answer on Stackoverflow
Solution 7 - Javauser3789608View Answer on Stackoverflow
Solution 8 - JavaAsif Aminur RashidView Answer on Stackoverflow
Solution 9 - JavaraziView Answer on Stackoverflow
Solution 10 - JavaPaul LinuxView Answer on Stackoverflow
Solution 11 - JavaOusamaView Answer on Stackoverflow
Solution 12 - JavaBeagleView Answer on Stackoverflow