Приложение спринг + хибернейт. В контроллере происходит добавление роли пользователю: | Код | protected void doSubmitAction(Object command) throws Exception { UserRoleCommand URCommand = (UserRoleCommand)command; User user = userService.getUser(URCommand.getUid()); Role role = roleService.getRole(URCommand.getRoleId()); user.getRoles().add(role); userService.updateUser(user); //getHibernateTemplate().update(user); }
|
В классе User роли в виде Set roles = new HashSet(); При добавлении роли пользователю, все ок т.е. запись появляется в таблице ассоциаций tbUserRole. Если я повторно пытаюсь дать этуже роль пользователю, вылетает ошибка. Но по идее если я пытаюсь добавить запись в множество типа HashSet, сначала идет проверка есть ли уже такая запись и если есть то вставка непроисходит. У меня же идет добавление при котором вылетает ошибка: | Код | [DEBUG] 12:50:03 SQL - insert into tbRoleUser (UID, RoleID) values (?, ?) Hibernate: insert into tbRoleUser (UID, RoleID) values (?, ?) [DEBUG] 12:50:03 LongType - binding '1' to parameter: 1 [DEBUG] 12:50:03 LongType - binding '1' to parameter: 2 [ WARN] 12:50:03 JDBCExceptionReporter - SQL Error: 2627, SQLState: 23000 [ERROR] 12:50:03 JDBCExceptionReporter - Violation of PRIMARY KEY constraint 'PK_tbRoleUser'. Cannot insert duplicate key in object 'dbo.tbRoleUser'. [ERROR] 12:50:03 AbstractFlushingEventListener - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: could not insert collection rows: [webmin.model.User.roles#1] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:63) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1087) at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:48) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:223) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:274) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:730) at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:388) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:363) at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:644) at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:640) at webmin.hibernate.UserDaoHibernate.updateUser(UserDaoHibernate.java:22) at webmin.service.UserServiceImpl.updateUser(UserServiceImpl.java:20) at webmin.web.GrantUserRoleController.doSubmitAction(GrantUserRoleController.java:59) at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:415) at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:382) at org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:356) at org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:258) at org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:249) at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:723) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:663) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:394) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:358) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:75) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:833) at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639) at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1285) at java.lang.Thread.run(Thread.java:595) Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Violation of PRIMARY KEY constraint 'PK_tbRoleUser'. Cannot insert duplicate key in object 'dbo.tbRoleUser'. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source) at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.sendExecute(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteUpdate(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source) at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:22) at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1073) ... 43 more
|
Подскажите почему так. Если надо, я покажу маппинг или пожо классы.
|