сразу прошу прощение за возможное дублирование, но я просто озадачен Такая ситуация: есть обьект User. к нему относятся Manager и Probationer. Manager может иметь много Probationerov и Probationer, в свою очередь, может иметь много Managerov. Т.е. у User получается связь на самого себя many-to-many. Вот модель User: | Код |
public class User {
private String firstName;
private String lastName;
private List<User> probationers = new LinkedList<User>();
private List<User> managers = new LinkedList<User>();
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
public List<User> getManagers() { return managers; }
public void setManagers(List<User> managers) { this.managers = managers; }
public List<User> getProbationers() { return probationers; }
public void setProbationers(List<User> probationers) { this.probationers = probationers; }
}
|
Вот пример как это реализованно в маппинге: | Код |
<list name="managers" table="USER_MANAGER" cascade="all" inverse="false"> <key column="USER_ID"/> <index column="MANAGER_INDEX"/> <many-to-many class="com.mycompany.myproject.model.user.User" column="MANAGER_ID"/> </list>
<list name="probationers" table="USER_MANAGER" cascade="all" linverse="false"> <key column="MANAGER_ID"/> <index column="USER_INDEX"/> <many-to-many class="com.mycompany.myproject.model.user.User" column="USER_ID"/> </list>
|
теперь следуюющее: при назначении Manageru Probationerov (или наоборот) пытаюсь сохранить текущего юзера: | Код |
Iterator<User> iterator = probationerList.iterator(); while(iterator.hasNext()){ User probationer = iterator.next(); probationer.getManagers().add(currentUser); }
currentUser.setProbationers(probationerList); userDAO.save(currentUser);
|
и получаю следующиий Exception: | Код |
SEVERE: ORA-01400: cannot insert NULL into ("MYPROJECT"."USER_MANAGER"."MANAGER_INDEX")
Apr 18, 2008 4:42:57 PM org.hibernate.util.JDBCExceptionReporter logExceptions WARNING: SQL Error: 1400, SQLState: 23000 Apr 18, 2008 4:42:57 PM org.hibernate.util.JDBCExceptionReporter logExceptions SEVERE: ORA-01400: cannot insert NULL into ("MYPROJECT"."USER_MANAGER"."MANAGER_INDEX")
Apr 18, 2008 4:42:57 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions SEVERE: Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92) at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87) at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:222) at org.hibernate.persister.collection.AbstractCollectionPersister.insertRows(AbstractCollectionPersister.java:1341) at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:56) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:234) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) at org.springframework.orm.hibernate3.HibernateAccessor.flushIfNecessary(HibernateAccessor.java:390) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:374) at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:693) at com.mycompany.myroject.dataaccess.AbstractDAO.save(AbstractDAO.java:116) at com.mycompany.myroject.presentation.action.ProfileAdministrationAction.attach(ProfileAdministrationAction.java:441) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270) at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187) at org.apache.struts.actions.LookupDispatchAction.execute(LookupDispatchAction.java:150) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196) at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414) at javax.servlet.http.HttpServlet.service(HttpServlet.java:689) 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.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265) at org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107) at org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:124) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:110) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249) at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149) at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98) 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.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) Caused by: java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("MYPROJECT"."USER_MANAGER"."MANAGER_INDEX")
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:367) at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:8739) at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:294) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) ... 65 more Apr 18, 2008 4:42:57 PM org.apache.struts.action.RequestProcessor processException WARNING: Unhandled Exception thrown: class org.springframework.dao.DataIntegrityViolationException Apr 18, 2008 4:42:57 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet action threw exception java.sql.BatchUpdateException: ORA-01400: cannot insert NULL into ("MYPROJECT"."USER_MANAGER"."MANAGER_INDEX")
|
В связующей таблице 4 столбца (MANAGER_ID, MANAGER_INDEX, USER_ID, USER_INDEX). как покаал debug на момент сохранения в списоке probationers у currentUser присутсвуют добавляемые user-ы, а у тех в свою очередь в списке managers присутствует currentUser. В чём проблема???? помогите раобраться.
|