title: Hibernate exception; found two representations of the same collection
body: <p>While working on a Spring 3 MVC project using Hibernate, we encountered an annoying error. We are creating a carpool application. People can add routes (using the Gmap 3 plugin for jQuery) and can add waypoints to their route. In the database, a waypoint has a foreign key to a route. When trying to update a route (adding/removing waypoints and re-saving the route), we get the "found two representations of the same collection" error. We've researched the Internet but mostly the topics talk about the Play framework (we don't use that) and furthermore they talk about annotations as mapping method (while we use XML mappings). Does anyone have any idea how we can fix this? Or is this a problem in Hibernate itself?</p>
  
  <p>Some code to clarify the problem:</p>
  
  <p>XML mapping of the route class:</p>
  
  <pre><code>&lt;?xml version="1.0"?&gt;
  &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"&gt;
  &lt;hibernate-mapping&gt;
      &lt;class name="be.kdg.teamb.model.pojo.Route" table="route"&gt;
          &lt;id name="routeid" type="java.lang.Integer"&gt;
              &lt;generator class="identity"/&gt;
          &lt;/id&gt;
          &lt;property name="departure" not-null="true"/&gt;
          &lt;property name="latitude_departure" /&gt;
          &lt;property name="longtidude_departure" /&gt;
          &lt;property name="destination" not-null="true"/&gt;
          &lt;property name="latitude_destination" /&gt;
          &lt;property name="longtidude_destination" /&gt;
          &lt;property name="departureTime" not-null="true" type="java.util.Date" /&gt;
          &lt;property name="startDate" not-null="true" type="java.util.Date"/&gt;
          &lt;property name="endDate" type="java.util.Date" /&gt;
          &lt;many-to-one name="driver" column="userid" not-null="true" cascade="save-update" /&gt;
          &lt;many-to-one name="defaultCar" column="carid" not-null="true" cascade="save-                update"/&gt;
          &lt;set name="waypoints" cascade="all,delete-orphan" inverse="true"&gt;
              &lt;key column="routeid" on-delete="cascade" /&gt;
              &lt;one-to-many class="be.kdg.teamb.model.pojo.Waypoint" /&gt;
          &lt;/set&gt;
          &lt;set name="rides" cascade="all,delete-orphan" inverse="true"&gt;
              &lt;key column="routeid" on-delete="cascade" /&gt;
              &lt;one-to-many class="be.kdg.teamb.model.pojo.Ride"/&gt;
          &lt;/set&gt;
          &lt;set name="rules" cascade="all,delete-orphan" inverse="true"&gt;
              &lt;key column="routeid" on-delete="cascade" /&gt;
              &lt;one-to-many class="be.kdg.teamb.model.pojo.RouteRule" /&gt;
          &lt;/set&gt;
      &lt;/class&gt;
  &lt;/hibernate-mapping&gt;
  </code></pre>
  
  <p>XML mapping of the waypoint class:</p>
  
  <pre><code>&lt;?xml version="1.0"?&gt;
  &lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"&gt;
  &lt;hibernate-mapping&gt;
      &lt;class name="be.kdg.teamb.model.pojo.Waypoint" table="waypoint"&gt;
          &lt;id name="waypointid" type="java.lang.Integer"&gt;
              &lt;generator class="identity"/&gt;
          &lt;/id&gt;
          &lt;property name="latitude" not-null="true" /&gt;
          &lt;property name="longtidude" not-null="true" /&gt;
          &lt;property name="address" not-null="true" /&gt;
          &lt;many-to-one name="route" column="routeid" not-null="true" cascade="all" /&gt;
      &lt;/class&gt;
  &lt;/hibernate-mapping&gt;
  </code></pre>
  
  <p>Code in our serivce:</p>
  
  <pre><code>@Override
  @Transactional
  public void add(String departureCoordinates, String departure, String destinationCoordinates, String destination, String coordinatesWaypoints, String namesWaypoints, String user, int carID, Date beginDate, Date endDate, Date departureTime) {
  
      User usr = userDao.get(user);
  
      Route route = new Route();
  
      //formaat: latitude-longtitude
      String[] coords = departureCoordinates.split(",");
  
      String departureLatitude = coords[0];
      String departureLongtitude = coords[1];
  
      coords = destinationCoordinates.split(",");
  
      String destinationLatitude = coords[0];
      String destinationLongtitude = coords[1];
  
      // add route information
      route.setDeparture(departure);
      route.setLatitude_departure(departureLatitude);
      route.setLongtidude_departure(departureLongtitude);
  
      route.setDestination(destination);
      route.setLatitude_destination(destinationLatitude);
      route.setLongtidude_destination(destinationLongtitude);
  
      route.setDriver(usr);
      route.setDefaultCar(carDao.get(carID));
  
      route.setStartDate(beginDate);
      route.setDepartureTime(departureTime);
      route.setEndDate(endDate);
  
      if (coordinatesWaypoints != null &amp;&amp; coordinatesWaypoints.trim().length() != 0) {
          String[] waypoints = coordinatesWaypoints.split(";;;");
          String[] waypointNames = namesWaypoints.split(";;;");
  
          int i = 0;
  
          for (String waypointAddress : waypointNames) {
              String[] waypointCoord = waypoints[i].split(",");
  
              String waypointLat = waypointCoord[0];
              String waypointLon = waypointCoord[1];
  
              Waypoint waypoint = new Waypoint();
  
              waypoint.setAddress(waypointAddress);
              waypoint.setLatitude(waypointLat);
              waypoint.setLongtidude(waypointLon);
  
              route.addWaypoint(waypoint);
  
              i++;
          }
      }
          else{
              for (Waypoint waypoint : route.getWaypoints()) {
                  waypointDao.delete(waypoint);
              }
  
  
      }
  
      routeDao.save(route);
  
      socialMediaService.post(user, "http://localhost:8080/route/detail/" + route.getRouteid(), "Posted a new route! From " + route.getDeparture() + " to " + route.getDestination(), "Posted new route!", "Carpool teamb", "Posted a new route! From " + route.getDeparture());
  
  }
  </code></pre>
  
  <p>The error stacktrace:</p>
  
  <pre><code>HTTP Status 500 -
  
  type Exception report
  
  message
  
  description The server encountered an internal error () that prevented it from fulfilling this request.
  
  exception
  
  org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: Found two representations of same collection: be.kdg.teamb.model.pojo.Route.waypoints
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894)
   org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
   org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
   org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
   org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
   org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
   org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  root cause
  
  org.hibernate.HibernateException: Found two representations of same collection: be.kdg.teamb.model.pojo.Route.waypoints
   org.hibernate.engine.Collections.processReachableCollection(Collections.java:175)
   org.hibernate.event.def.FlushVisitor.processCollection(FlushVisitor.java:60)
   org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:122)
   org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:83)
   org.hibernate.event.def.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:77)
   org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:165)
   org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
   org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
   org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
   org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
   org.hibernate.impl.SessionImpl.list(SessionImpl.java:1261)
   org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
   org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:890)
   be.kdg.teamb.model.dao.impl.UserDaoImpl.get(UserDaoImpl.java:31)
   be.kdg.teamb.model.service.impl.UserServiceImpl.get(UserServiceImpl.java:222)
   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   java.lang.reflect.Method.invoke(Method.java:597)
   org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
   $Proxy33.get(Unknown Source)
   be.kdg.teamb.model.service.impl.SocialMediaServiceImpl.post(SocialMediaServiceImpl.java:36)
   be.kdg.teamb.model.service.impl.RouteServiceImpl.update(RouteServiceImpl.java:202)
   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   java.lang.reflect.Method.invoke(Method.java:597)
   org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
   $Proxy40.update(Unknown Source)
   be.kdg.teamb.controller.RouteController.edit(RouteController.java:258)
   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   java.lang.reflect.Method.invoke(Method.java:597)
   org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212)
   org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
   org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
   org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
   org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
   org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
   org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
   org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
   org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
   org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
   org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
   org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
   org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
   org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
   org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
   org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
   org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  note The full stack trace of the root cause is available in the Apache Tomcat/7.0.25 logs.
  
  Apache Tomcat/7.0.25
  </code></pre>
  
  <p>We also tried adding <code>route.getWaypoints().clear();</code> but that didn't seem to help.</p>
  
  <p>Any suggestions on what to do? If you want more information, just ask.</p>