When working on a Spring 3 MVC project using Hibernate, we encountered an annoying error. We are creating an application for cars. People can add routes (using the Gmap 3 plugin for jQuery) and can add waypoints to their route. The waypoint in the database has a foreign key to the route. When we try to update the route (adding / deleting waypoints and re-saving the route) we get the error "found two views of the same collection." We explored the Internet, but mostly topics talk about the Play platform (we don’t use this), and in addition, they talk about annotations as a mapping method (as long as we use XML mappings). Does anyone know how we can fix this? Or is this a problem in Hibernate itself?
Some code to clarify the problem:
Route class XML mapping:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="be.kdg.teamb.model.pojo.Route" table="route">
<id name="routeid" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="departure" not-null="true"/>
<property name="latitude_departure" />
<property name="longtidude_departure" />
<property name="destination" not-null="true"/>
<property name="latitude_destination" />
<property name="longtidude_destination" />
<property name="departureTime" not-null="true" type="java.util.Date" />
<property name="startDate" not-null="true" type="java.util.Date"/>
<property name="endDate" type="java.util.Date" />
<many-to-one name="driver" column="userid" not-null="true" cascade="save-update" />
<many-to-one name="defaultCar" column="carid" not-null="true" cascade="save- update"/>
<set name="waypoints" cascade="all,delete-orphan" inverse="true">
<key column="routeid" on-delete="cascade" />
<one-to-many class="be.kdg.teamb.model.pojo.Waypoint" />
</set>
<set name="rides" cascade="all,delete-orphan" inverse="true">
<key column="routeid" on-delete="cascade" />
<one-to-many class="be.kdg.teamb.model.pojo.Ride"/>
</set>
<set name="rules" cascade="all,delete-orphan" inverse="true">
<key column="routeid" on-delete="cascade" />
<one-to-many class="be.kdg.teamb.model.pojo.RouteRule" />
</set>
</class>
</hibernate-mapping>
XML- :
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="be.kdg.teamb.model.pojo.Waypoint" table="waypoint">
<id name="waypointid" type="java.lang.Integer">
<generator class="identity"/>
</id>
<property name="latitude" not-null="true" />
<property name="longtidude" not-null="true" />
<property name="address" not-null="true" />
<many-to-one name="route" column="routeid" not-null="true" cascade="all" />
</class>
</hibernate-mapping>
:
@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();
String[] coords = departureCoordinates.split(",");
String departureLatitude = coords[0];
String departureLongtitude = coords[1];
coords = destinationCoordinates.split(",");
String destinationLatitude = coords[0];
String destinationLongtitude = coords[1];
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 && 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());
}
stacktrace:
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
route.getWaypoints().clear();, .
, ? , .