Uploaded image for project: 'Hibernate ORM'
  1. HHH-3771

Best practice for equals/hashCode implementation

    Details

    • Last commented by a user?:
      true

      Description

      When domain model contains even one lazy reference to an object, default equals fails when it's compared to a) the actual implementation returned by Session.get/load or b) other proxies (at least of different supertype). Overriding equals on a class that uses surrogate id is not that simple. However, there is a simple solution to this problem:

      In domain class, override equals like this:

      public boolean equals(Object obj) {
        return this == getImplementation(obj);
      }
      
      public static Object getImplementation(Object obj) {
        if (obj instanceof HibernateProxy) {
          return ((HibernateProxy) obj).getHibernateLazyInitializer().getImplementation();
        } else {
          return obj; 
        }
      }
      

      This should result always in comparing object references of actual instances and thus preserve symmetry.

      It's understandable that you don't wan to publish that kind of getImplementation utility e.g. in Hibernate, but maybe you could support this more directly by implementing

      Hibernate.equals(Object o1, Object o2)

        Attachments

          Issue links

            Activity

              People

              • Votes:
                1 Vote for this issue
                Watchers:
                3 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: