2009-10-23 10 views
5

Me estoy ejecutando en una ConstraintViolationException cuando intento guardar un objeto con un mapa @OneToMany en él. Hibernate parece pensar que estoy tratando de poner un NULL en la lista mapeada o puede estar poniéndolo allí. El problema parece ocurrir esporádicamente: con algunas bases de datos es fácilmente reproducible, pero con otras no puedo lograr que suceda.Hibernate ConstraintViolationException en la tabla de combinación

Soy un novato tanto en Hibernate como en Hibernate Annotations, por lo que cualquier ayuda sería muy apreciada.

Tengo dos clases: Cámara y AlarmZone (que se extiende a una tercera clase, Zona). Entre otras cosas, Camera contiene una lista de ID de objetos AlarmZone. He aquí las declaraciones de clase:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "cameras") 
public class Camera 
{ 
    private Serializable id; 

    private List<Serializable> alarm_zones = new ArrayList<Serializable>(); 

    ... 

    @Id(generate = GeneratorType.SEQUENCE) 
    @Type(type = "java.lang.Long") 
    public java.io.Serializable getId() 
    { 
     return this.id; 
    } 

    public void setId(java.io.Serializable id) 
    { 
     this.id = id; 
    } 

    @OneToMany(targetEntity = java.lang.Long.class, fetch = FetchType.EAGER) 
    @JoinTable(table = @Table(name = "cameraalarmzones")) 
    public List<Serializable> getAlarmZones() 
    { 
     return alarm_zones; 
    } 

    public void setAlarmZones(List<Serializable> alarm_zones) 
    { 
     this.alarm_zones = alarm_zones; 
    } 

    ... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "zones") 
public class Zone 
{ 
    private Serializable id; 

    ... 

    @Id(generate = GeneratorType.SEQUENCE) 
    @Type(type = "java.lang.Long") 
    public java.io.Serializable getId() 
    { 
     return this.id; 
    } 

    public void setId(java.io.Serializable id) 
    { 
     this.id = id; 
    } 
} 

@Entity 
@Table(name = "alarmzones") 
public class AlarmZone extends Zone 
{ 
    ... 
} 

Siempre que puedo guardar un objeto, utilizo lo que entiendo que se comprometan repetitivo código:

public Persistable makePersistent(Object entity) 
{ 
    try 
    { 
     Hibernate.getSession().beginTransaction(); 
     Hibernate.getSession().saveOrUpdate(entity); 
     Hibernate.getSession().flush(); 
     Hibernate.getSession().getTransaction().commit(); 
    } catch (RuntimeException e) 
    { 
     Hibernate.getSession().getTransaction().rollback(); 
     logger.error("makePersistent(" + entity.getClass().getSimpleName() 
       + ")", e); 
    } 
    return entity; 
} 

El problema ocurre al guardar un AlarmZone, a continuación, poner su identificación en la lista de la cámara e intenta guardar la cámara. Para obtener una mejor información de depuración, seguí los consejos del https://forum.hibernate.org/viewtopic.php?p=2220295&sid=a7ccc3be32137436c8062a99c8372a9e y configuré el tamaño del lote como 0 y activé la depuración del nivel de DEPURACIÓN en log4j. Aquí está el seguimiento de la pila para el error (junto con las pocas líneas anteriores):

[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractCollectionPersister.java:947) - Deleting collection: [x.y.z.Camera.alarmZones#641] 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:311) - about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:346) - delete from cameraalarmzones where cameras_id=? 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:424) - preparing statement 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (NullableType.java:79) - binding '641' to parameter: 1 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractCollectionPersister.java:977) - done deleting collection 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractCollectionPersister.java:999) - Inserting collection: [x.y.z.Camera.alarmZones#641] 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:319) - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:470) - closing statement 
[2009-10-23 14:33:07,606] DEBUG [http-8443-Processor25] (AbstractBatcher.java:311) - about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (AbstractBatcher.java:346) - insert into cameraalarmzones (cameras_id, elt) values (?, ?) 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (AbstractBatcher.java:424) - preparing statement 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (NullableType.java:79) - binding '641' to parameter: 1 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (NullableType.java:79) - binding '649' to parameter: 2 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (AbstractBatcher.java:319) - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
[2009-10-23 14:33:07,622] DEBUG [http-8443-Processor25] (AbstractBatcher.java:470) - closing statement 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (JDBCExceptionReporter.java:63) - could not insert collection: [x.y.z.Camera.alarmZones#641] [insert into cameraalarmzones (cameras_id, elt) values (?, ?)] 
java.sql.SQLException: Attempt to insert null into a non-nullable column: column: ALARMZONES table: CAMERAALARMZONES in statement [insert into cameraalarmzones (cameras_id, elt) values (?, ?)] 
    at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1039) 
    at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:51) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980) 
    at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:292) 
    at $Proxy25.flush(Unknown Source) 
    at com.silkspeed.ssparts.server.PersistableDAOImpl.makePersistent(PersistableDAOImpl.java:82) 
    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:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) 
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:68) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) 
    at $Proxy38.makePersistent(Unknown Source) 
    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:597) 
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:179) 
    at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:33) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:76) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:112) 
    at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at x.y.z.server.SessionInfo.doFilter(SessionInfo.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 
[2009-10-23 14:33:07,637] WARN [http-8443-Processor25] (JDBCExceptionReporter.java:71) - SQL Error: -10, SQLState: 23000 
[2009-10-23 14:33:07,637] ERROR [http-8443-Processor25] (JDBCExceptionReporter.java:72) - Attempt to insert null into a non-nullable column: column: ALARMZONES table: CAMERAALARMZONES in statement [insert into cameraalarmzones (cameras_id, elt) values (?, ?)] 
[2009-10-23 14:33:07,637] ERROR [http-8443-Processor25] (AbstractFlushingEventListener.java:299) - Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: could not insert collection: [x.y.z.Camera.alarmZones#641] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1058) 
    at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:51) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980) 
    at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:292) 
    at $Proxy25.flush(Unknown Source) 
    at com.silkspeed.ssparts.server.PersistableDAOImpl.makePersistent(PersistableDAOImpl.java:82) 
    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:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) 
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:68) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) 
    at $Proxy38.makePersistent(Unknown Source) 
    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:597) 
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:179) 
    at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:33) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:76) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:112) 
    at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at x.y.z.server.SessionInfo.doFilter(SessionInfo.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.sql.SQLException: Attempt to insert null into a non-nullable column: column: ALARMZONES table: CAMERAALARMZONES in statement [insert into cameraalarmzones (cameras_id, elt) values (?, ?)] 
    at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1039) 
    ... 58 more 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (JDBCTransaction.java:152) - rollback 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (JDBCTransaction.java:193) - re-enabling autocommit 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (JDBCTransaction.java:163) - rolled back JDBC Connection 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (JDBCContext.java:207) - after transaction completion 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (ConnectionManager.java:296) - aggressively releasing JDBC connection 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (ConnectionManager.java:333) - closing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (DriverManagerConnectionProvider.java:129) - returning connection to pool, pool size: 1 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (SessionImpl.java:434) - after transaction completion 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (SessionImpl.java:368) - automatically closing session 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (SessionImpl.java:296) - closing session 
[2009-10-23 14:33:07,637] DEBUG [http-8443-Processor25] (ConnectionManager.java:267) - connection already null in cleanup : no action 
[2009-10-23 14:33:07,637] ERROR [http-8443-Processor25] (PersistableDAOImpl.java:87) - makePersistent(Camera) 
org.hibernate.exception.ConstraintViolationException: could not insert collection: [x.y.z.Camera.alarmZones#641] 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1058) 
    at org.hibernate.action.CollectionUpdateAction.execute(CollectionUpdateAction.java:51) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:243) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:227) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980) 
    at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:292) 
    at $Proxy25.flush(Unknown Source) 
    at com.silkspeed.ssparts.server.PersistableDAOImpl.makePersistent(PersistableDAOImpl.java:82) 
    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:597) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:292) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:155) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:122) 
    at org.springframework.remoting.support.RemoteInvocationTraceInterceptor.invoke(RemoteInvocationTraceInterceptor.java:68) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:144) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:174) 
    at $Proxy38.makePersistent(Unknown Source) 
    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:597) 
    at org.springframework.remoting.support.RemoteInvocation.invoke(RemoteInvocation.java:179) 
    at org.springframework.remoting.support.DefaultRemoteInvocationExecutor.invoke(DefaultRemoteInvocationExecutor.java:33) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invoke(RemoteInvocationBasedExporter.java:76) 
    at org.springframework.remoting.support.RemoteInvocationBasedExporter.invokeAndCreateResult(RemoteInvocationBasedExporter.java:112) 
    at org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.handleRequest(HttpInvokerServiceExporter.java:80) 
    at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:684) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:625) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:357) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at x.y.z.server.SessionInfo.doFilter(SessionInfo.java:91) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) 
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: java.sql.SQLException: Attempt to insert null into a non-nullable column: column: ALARMZONES table: CAMERAALARMZONES in statement [insert into cameraalarmzones (cameras_id, elt) values (?, ?)] 
    at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
    at org.hsqldb.jdbc.jdbcPreparedStatement.executeUpdate(Unknown Source) 
    at org.hibernate.jdbc.NonBatchingBatcher.addToBatch(NonBatchingBatcher.java:23) 
    at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1039) 
    ... 58 more 

aquí es mi hibernación fichero de configuración:

<property name="connection.driver_class">org.hsqldb.jdbcDriver</property> 
    <property name="connection.url">jdbc:hsqldb:file:dbfilename;shutdown=true</property> 
    <property name="connection.username">*************</property> 
    <property name="connection.password">*************</property> 
    <property name="connection.autocommit">true</property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 

    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">false</property> 

<property name="hibernate.jdbc.batch_size">0</property> 
<property name="hibernate.jdbc.fetch_size">0</property> 

    <!-- Drop and re-create the database schema on startup --> 
<property name="hbm2ddl.auto">update</property> 


<mapping class="com.silkspeed.sightlogix.cs.AlarmZone"/> 
<mapping class="com.silkspeed.sightlogix.cs.Camera" /> 
<mapping class="com.silkspeed.sightlogix.cs.Zone"/> 

... 

Gracias de antemano.

Respuesta

3

Hay varios problemas con su código:

  1. Has ids declarados como Serializable en lugar de llanura long (o Long). ¿Por qué?
  2. Debe asignar instancias reales Zone (o AlarmZone si lo desea) en su relación de OneToMany en lugar de identificadores. No hay necesidad de una tabla intermedia a menos que la relación sea realmente ManyToMany, en cuyo caso debe asignarse como tal (¿puede una sola AlarmZone pertenecer a más de una cámara? Si es así, es de muchas a muchas).
  3. Tiene una anotación de herencia en su entidad Camera. ¿Por qué? ¿Es parte de otra jerarquía?
  4. El código "repetitivo" que está utilizando es malo. La transacción debe incluir un entire unit of work, no una entidad individual. El enjuague explícito es innecesario.

mapeo de la muestra:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "cameras") 
public class Camera { 
    private long id; 
    private List<AlarmZone> alarm_zones = new ArrayList<AlarmZone>(); 

    @SequenceGenerator(name="Camera_Gen", sequenceName="cameras_seq") 
    @Id @GeneratedValue(generator="Camera_Gen")  
    public long getId() { 
     return this.id; 
    } 

    @OneToMany(mappedBy="camera") // this maps a bi-directional relationship 
    public List<AlarmZone> getAlarmZones() { 
     return alarm_zones; 
    } 

    ... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "zones") 
public class Zone { 
    // same deal as above 
    ... 
} 

@Entity 
@Table(name = "alarmzones") 
public class AlarmZone extends Zone { 
    private Camera camera; 

    @ManyToOne 
    public Camera getCamera() { 
    return this.camera; 
    } 
} 

detalles sobre identifier mapping y association mapping.

+0

Gracias por los consejos.Son muy apreciados. Definitivamente estoy de acuerdo en que tener una lista de objetos reales de AlarmZone es el camino a seguir, pero realmente no tengo tiempo suficiente para realizar los cambios necesarios en la base de código. ¿Tiene alguna idea de qué podría estar causando la excepción en la inserción de la tabla de unión? – Seth

+1

No me refiero a ser un imbécil al respecto, pero si no tiene tiempo para hacerlo correctamente ahora, ¿cómo va a encontrar el momento más tarde (cuando haya construido más cosas sobre esto)? El problema con los identificadores de AlarmZone es que Long no es una entidad; NO puedes mapear identificadores como @OneToMany. La única forma de asignarlos es a través de @CollectionOfElements; consulte la sección 2.4.6.2.5 de los documentos de Hibernate Annotations para ver un ejemplo. – ChssPly76

+0

Desafortunadamente, hay circunstancias fuera de mi control que me impiden hacerlo correctamente en este momento (específicamente, refactorizar el código para encerrar una unidad completa de trabajo y cambiar la clase de la Cámara para tener AlarmZones reales tomaría mucho más tiempo que el que tengo. Ese mal código repetitivo está esparcido por toda la aplicación). – Seth

Cuestiones relacionadas