Hi Oscar, thanks for doing this analysis. I haven't delved to it in detail, but it seems to me that you are probably right that we need to make some changes down in IsisTransactionManager. I wouldn't worry about breaking semantic versioning; this isn't part of any formally published Isis API.
As a first pass, could you create a Jira ticket for the above. If you think you know what the patch needs to be, then go ahead, but I'll take a detailed look as well, either this evening or tomorrow. Thx Dan On 3 August 2013 11:10, GESCONSULTOR - Óscar Bou <[email protected]>wrote: > > I'm executing this from inside a BDD integration test. > > > I have a Domain Object that inherits from this class, which contains a > required "name" property: > > public abstract class AbstractMultiTenantEntity extends > AbstractMultiTenantObject implements MultiTenantEntity { > > /** > * Name of this Entity. > */ > private String name; > > @Column(allowsNull = "false") > @Override > @MemberOrder(sequence = "0.1") > public String getName() { > return this.name; > } > > @Override > public void setName(final String name) { > this.name = name; > } > > public String validateName(final String name) { > if (name == null) { > return "Name cannot be an empty string"; > } else { > return null; > } > } > > ... > } > > > > The Domain Object class is declared simply as: > > public class Risk extends AbstractMultiTenantEntity { > > ... > > } > > > I have a factory method like this one: > > public Risk addQuantitativeRiskToAsset(...) { > > .... > > // Here the "name" field is null. > this.persist(risk); > return risk; > } > > > > The point is that, due to a "programming error", I was not initializing > the "name" field (it was null). But this could happen also on other use > cases. > > But the main problem is that, when the this.persist(risk) method is > executed, it does not validate it and "detect" that the name property is > null, and does not raise any validation exception. > > > As the "database persist" is "cached", the only line appearing at the log > is: > > > 10:44:16,317 [DataNucleusSimplePersistAlgorithm main INFO ] > persist PojoAdapter@6ac42aea > [T~~:!com.xms.framework.risk.domain.model.Risk:461a09cf-c483-4779-ae58-a1840baf6a9c,specification=Risk,version=null,pojo-toString=com.xms.framework.risk.domain.model.Risk@6ee01906 > ,pojo-hash=#6ee01906] > > > But on the first "flush()", when the persistence manager tries to insert > the record the following exception is showed in the log: > > > ------------------------- > > 11:12:30,643 [DataNucleusSimplePersistAlgorithm main INFO ] > persist PojoAdapter@6d70c116 > [T~~:!com.xms.framework.risk.domain.model.Risk:bff8097b-72d9-40e1-b6de-aab8f5743194,specification=Risk,version=null,pojo-toString=com.xms.framework.risk.domain.model.Risk@85f4d6e2 > ,pojo-hash=#ffffffff85f4d6e2] > 11:12:30,894 [audit main INFO ] 2. > PreparedStatement.new PreparedStatement returned > 11:12:30,894 [audit main INFO ] 2. > Connection.prepareStatement(INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?), 1) returned > net.sf.log4jdbc.PreparedStatementSpy@afe1bc5 > 11:12:30,894 [audit main INFO ] 2. > PreparedStatement.clearBatch() returned > 11:12:30,894 [audit main INFO ] 2. > PreparedStatement.setTimestamp(23, 2013-08-03 11:12:30.643, > java.util.GregorianCalendar[time=1375521135947,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Madrid",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Madrid,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2013,MONTH=7,WEEK_OF_YEAR=31,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=215,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=12,SECOND=15,MILLISECOND=947,ZONE_OFFSET=3600000,DST_OFFSET=3600000]) > returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setTimestamp(22, 2013-08-03 11:12:30.643, > java.util.GregorianCalendar[time=1375521135947,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Madrid",offset=3600000,dstSavings=3600000,useDaylight=true,transitions=165,lastRule=java.util.SimpleTimeZone[id=Europe/Madrid,offset=3600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2013,MONTH=7,WEEK_OF_YEAR=31,WEEK_OF_MONTH=1,DAY_OF_MONTH=3,DAY_OF_YEAR=215,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=12,SECOND=15,MILLISECOND=947,ZONE_OFFSET=3600000,DST_OFFSET=3600000]) > returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(21, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(20, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setString(19, "TENANT") returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setString(18, "tester") returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(17, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(16, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(15, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setLong(14, 2) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(13, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(12, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setLong(11, 15) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(10, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(9, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setString(8, "tester") returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setBigDecimal(7, 1000.0) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setLong(6, 0) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(5, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setBigDecimal(4, 0.5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setBoolean(3, true) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(2, 12) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setString(1, "2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B") > returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(24, -5) returned > 11:12:30,895 [audit main INFO ] 2. > PreparedStatement.setNull(25, -5) returned > 11:12:30,895 [Native main DEBUG] INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > (<'2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B'>,<null>,<true>,<0.5>,<null>,<0>,<1000.0>,<'tester'>,<null>,<null>,<15>,<null>,<null>,<2>,<null>,<null>,<null>,<'tester'>,<'TENANT'>,<null>,<null>,<2013-08-03 > 11:12:30.643>,<2013-08-03 11:12:30.643>,<null>,<null>) > 11:12:30,895 [Native main DEBUG] INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > (<'2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B'>,<null>,<true>,<0.5>,<null>,<0>,<1000.0>,<'tester'>,<null>,<null>,<15>,<null>,<null>,<2>,<null>,<null>,<null>,<'tester'>,<'TENANT'>,<null>,<null>,<2013-08-03 > 11:12:30.643>,<2013-08-03 11:12:30.643>,<null>,<null>) > 11:12:30,895 [Native main DEBUG] INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > (<'2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B'>,<null>,<true>,<0.5>,<null>,<0>,<1000.0>,<'tester'>,<null>,<null>,<15>,<null>,<null>,<2>,<null>,<null>,<null>,<'tester'>,<'TENANT'>,<null>,<null>,<2013-08-03 > 11:12:30.643>,<2013-08-03 11:12:30.643>,<null>,<null>) > 11:12:30,895 [sqlonly main INFO ] INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > ('2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B',NULL,1,0.5,NULL,0,1000.0,'tester',NULL,NULL,15,NULL,NULL,2,NULL,NULL,NULL,'tester','TENANT',NULL,NULL,'08/03/2013 > 11:12:30.643','08/03/2013 11:12:30.643',NULL,NULL) > 11:12:30,898 [audit main ERROR] 2. > PreparedStatement.executeUpdate() INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > ('2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B',NULL,1,0.5,NULL,0,1000.0,'tester',NULL,NULL,15,NULL,NULL,2,NULL,NULL,NULL,'tester','TENANT',NULL,NULL,'08/03/2013 > 11:12:30.643','08/03/2013 11:12:30.643',NULL,NULL) > java.sql.SQLIntegrityConstraintViolationException: violación del > restricción de integridad: restricción ('check') NOT NULL; SYS_CT_11646 > table: RISK column: "NAME" > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown > Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown > Source) > at > net.sf.log4jdbc.PreparedStatementSpy.executeUpdate(PreparedStatementSpy.java:1022) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.ParamLoggingPreparedStatement.executeUpdate(ParamLoggingPreparedStatement.java:399) > at > org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:439) > at > org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:409) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:167) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:143) > at > org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:3774) > at > org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:3750) > at > org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2125) > at > org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1973) > at > org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1821) > at > org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:727) > at > org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:752) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:360) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:354) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:367) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:333) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.flushTransaction(IsisTransactionManager.java:301) > at > org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession$7.flush(RuntimeContextFromSession.java:216) > at > org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.flush(DomainObjectContainerDefault.java:202) > at > com.xms.framework.risk.domain.model.RiskRegister.addQuantitativeRiskToAsset(RiskRegister.java:391) > 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.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:94) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:55) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:220) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:412) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:509) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:236) > at > org.apache.isis.core.wrapper.internal.InvocationHandlerMethodInterceptor.intercept(InvocationHandlerMethodInterceptor.java:37) > at > com.xms.framework.risk.domain.model.RiskRegister$$EnhancerByCGLIB$$c25c4db1.addQuantitativeRiskToAsset(<generated>) > at > com.xms.framework.risk.integration.glue.risk.RiskRegisterGlue.when_add_quantitative_risk_to_this_risk_register_with_asset_and_threat_event_and_likelihood_and_impact(RiskRegisterGlue.java:211) > 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 cucumber.runtime.Utils$1.call(Utils.java:44) > at cucumber.runtime.Timeout.timeout(Timeout.java:12) > at cucumber.runtime.Utils.invoke(Utils.java:40) > at > cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:35) > at > cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:38) > at cucumber.runtime.Runtime.runStep(Runtime.java:271) > at > cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44) > at > cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39) > at > cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40) > at > cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:83) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:77) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:37) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.api.junit.Cucumber.run(Cucumber.java:82) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > Caused by: org.hsqldb.HsqlException: violación del restricción de > integridad: restricción ('check') NOT NULL; SYS_CT_11646 table: RISK > column: "NAME" > at org.hsqldb.error.Error.error(Unknown Source) > at org.hsqldb.Table.enforceRowConstraints(Unknown Source) > at org.hsqldb.Table.insertSingleRow(Unknown Source) > at org.hsqldb.StatementDML.insertRowSet(Unknown Source) > at org.hsqldb.StatementInsert.getResult(Unknown Source) > at org.hsqldb.StatementDMQL.execute(Unknown Source) > at org.hsqldb.Session.executeCompiledStatement(Unknown Source) > at org.hsqldb.Session.execute(Unknown Source) > ... 79 more > 11:12:30,902 [sqlonly main ERROR] 2. > PreparedStatement.executeUpdate() INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > ('2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B',NULL,1,0.5,NULL,0,1000.0,'tester',NULL,NULL,15,NULL,NULL,2,NULL,NULL,NULL,'tester','TENANT',NULL,NULL,'08/03/2013 > 11:12:30.643','08/03/2013 11:12:30.643',NULL,NULL) > java.sql.SQLIntegrityConstraintViolationException: violación del > restricción de integridad: restricción ('check') NOT NULL; SYS_CT_11646 > table: RISK column: "NAME" > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown > Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown > Source) > at > net.sf.log4jdbc.PreparedStatementSpy.executeUpdate(PreparedStatementSpy.java:1022) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.ParamLoggingPreparedStatement.executeUpdate(ParamLoggingPreparedStatement.java:399) > at > org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:439) > at > org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:409) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:167) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:143) > at > org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:3774) > at > org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:3750) > at > org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2125) > at > org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1973) > at > org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1821) > at > org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:727) > at > org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:752) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:360) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:354) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:367) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:333) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.flushTransaction(IsisTransactionManager.java:301) > at > org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession$7.flush(RuntimeContextFromSession.java:216) > at > org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.flush(DomainObjectContainerDefault.java:202) > at > com.xms.framework.risk.domain.model.RiskRegister.addQuantitativeRiskToAsset(RiskRegister.java:391) > 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.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:94) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:55) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:220) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:412) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:509) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:236) > at > org.apache.isis.core.wrapper.internal.InvocationHandlerMethodInterceptor.intercept(InvocationHandlerMethodInterceptor.java:37) > at > com.xms.framework.risk.domain.model.RiskRegister$$EnhancerByCGLIB$$c25c4db1.addQuantitativeRiskToAsset(<generated>) > at > com.xms.framework.risk.integration.glue.risk.RiskRegisterGlue.when_add_quantitative_risk_to_this_risk_register_with_asset_and_threat_event_and_likelihood_and_impact(RiskRegisterGlue.java:211) > 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 cucumber.runtime.Utils$1.call(Utils.java:44) > at cucumber.runtime.Timeout.timeout(Timeout.java:12) > at cucumber.runtime.Utils.invoke(Utils.java:40) > at > cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:35) > at > cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:38) > at cucumber.runtime.Runtime.runStep(Runtime.java:271) > at > cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44) > at > cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39) > at > cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40) > at > cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:83) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:77) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:37) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.api.junit.Cucumber.run(Cucumber.java:82) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > Caused by: org.hsqldb.HsqlException: violación del restricción de > integridad: restricción ('check') NOT NULL; SYS_CT_11646 table: RISK > column: "NAME" > at org.hsqldb.error.Error.error(Unknown Source) > at org.hsqldb.Table.enforceRowConstraints(Unknown Source) > at org.hsqldb.Table.insertSingleRow(Unknown Source) > at org.hsqldb.StatementDML.insertRowSet(Unknown Source) > at org.hsqldb.StatementInsert.getResult(Unknown Source) > at org.hsqldb.StatementDMQL.execute(Unknown Source) > at org.hsqldb.Session.executeCompiledStatement(Unknown Source) > at org.hsqldb.Session.execute(Unknown Source) > ... 79 more > 11:12:30,902 [sqltiming main ERROR] 2. > PreparedStatement.executeUpdate() FAILED! INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES > ('2BB81475-3DB5-49B6-A2C2-CEECEA5B1A4B',NULL,1,0.5,NULL,0,1000.0,'tester',NULL,NULL,15,NULL,NULL,2,NULL,NULL,NULL,'tester','TENANT',NULL,NULL,'08/03/2013 > 11:12:30.643','08/03/2013 11:12:30.643',NULL,NULL) {FAILED after 2 msec} > java.sql.SQLIntegrityConstraintViolationException: violación del > restricción de integridad: restricción ('check') NOT NULL; SYS_CT_11646 > table: RISK column: "NAME" > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.Util.sqlException(Unknown Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown > Source) > at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown > Source) > at > net.sf.log4jdbc.PreparedStatementSpy.executeUpdate(PreparedStatementSpy.java:1022) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) > at > org.datanucleus.store.rdbms.ParamLoggingPreparedStatement.executeUpdate(ParamLoggingPreparedStatement.java:399) > at > org.datanucleus.store.rdbms.SQLController.executeStatementUpdate(SQLController.java:439) > at > org.datanucleus.store.rdbms.request.InsertRequest.execute(InsertRequest.java:409) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertTable(RDBMSPersistenceHandler.java:167) > at > org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:143) > at > org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:3774) > at > org.datanucleus.state.JDOStateManager.makePersistent(JDOStateManager.java:3750) > at > org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2125) > at > org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1973) > at > org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1821) > at > org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:727) > at > org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:752) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:53) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:360) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:354) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:367) > at > org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:333) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.flushTransaction(IsisTransactionManager.java:301) > at > org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession$7.flush(RuntimeContextFromSession.java:216) > at > org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.flush(DomainObjectContainerDefault.java:202) > at > com.xms.framework.risk.domain.model.RiskRegister.addQuantitativeRiskToAsset(RiskRegister.java:391) > 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.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:94) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:55) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:220) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:52) > at > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:412) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:509) > at > org.apache.isis.core.wrapper.internal.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:236) > at > org.apache.isis.core.wrapper.internal.InvocationHandlerMethodInterceptor.intercept(InvocationHandlerMethodInterceptor.java:37) > at > com.xms.framework.risk.domain.model.RiskRegister$$EnhancerByCGLIB$$c25c4db1.addQuantitativeRiskToAsset(<generated>) > at > com.xms.framework.risk.integration.glue.risk.RiskRegisterGlue.when_add_quantitative_risk_to_this_risk_register_with_asset_and_threat_event_and_likelihood_and_impact(RiskRegisterGlue.java:211) > 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 cucumber.runtime.Utils$1.call(Utils.java:44) > at cucumber.runtime.Timeout.timeout(Timeout.java:12) > at cucumber.runtime.Utils.invoke(Utils.java:40) > at > cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:35) > at > cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:38) > at cucumber.runtime.Runtime.runStep(Runtime.java:271) > at > cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44) > at > cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39) > at > cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40) > at > cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:83) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63) > at > cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:77) > at cucumber.api.junit.Cucumber.runChild(Cucumber.java:37) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > at cucumber.api.junit.Cucumber.run(Cucumber.java:82) > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > Caused by: org.hsqldb.HsqlException: violación del restricción de > integridad: restricción ('check') NOT NULL; SYS_CT_11646 table: RISK > column: "NAME" > at org.hsqldb.error.Error.error(Unknown Source) > at org.hsqldb.Table.enforceRowConstraints(Unknown Source) > at org.hsqldb.Table.insertSingleRow(Unknown Source) > at org.hsqldb.StatementDML.insertRowSet(Unknown Source) > at org.hsqldb.StatementInsert.getResult(Unknown Source) > at org.hsqldb.StatementDMQL.execute(Unknown Source) > at org.hsqldb.Session.executeCompiledStatement(Unknown Source) > at org.hsqldb.Session.execute(Unknown Source) > ... 79 more > 11:12:30,903 [audit main INFO ] 2. > PreparedStatement.close() returned > 11:12:30,903 [Persist main WARN ] Persistencia del > objeto "com.xms.framework.risk.domain.model.Risk@1b373a71" con SQL > "INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" ha tirado un > error : violación del restricción de integridad: restricción ('check') NOT > NULL; SYS_CT_11646 table: RISK column: "NAME" > 11:12:30,903 [Persist main WARN ] Persistencia del > objeto "com.xms.framework.risk.domain.model.Risk@1b373a71" con SQL > "INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" ha tirado un > error : violación del restricción de integridad: restricción ('check') NOT > NULL; SYS_CT_11646 table: RISK column: "NAME" > 11:12:30,903 [Persist main WARN ] Persistencia del > objeto "com.xms.framework.risk.domain.model.Risk@1b373a71" con SQL > "INSERT INTO RISK > (ID,"NAME",AUTOMATICNAMING,LIKELIHOOD,CODE,EVENT_EVENT_ID_OID,IMPACT,UPDATEDBYUSER,DESCRIPTION,CATEGORY_RISKCATEGORY_ID_OID,ASSET_ENTITY_ID_OID,EVENTDESCRIPTION,CONSEQUENCESDESCRIPTION,RISKREGISTER_RISKREGISTER_ID_OID,EVENTSOURCEDESCRIPTION,OWNER_BUSINESSACTOR_ID_OID,IMPACTLEVEL_IMPACTLEVEL_ID_OID,CREATEDBYUSER,TENANTID,EVENTSOURCE_EVENTSOURCE_ID_OID,LIKELIHOODLEVEL_LIKELIHOODLEVEL_ID_OID,DATECREATED,DATEUPDATED,RISKSLEADEDBYIT_VULNERABILITY_ID_OID,RISKSMODIFIED_CONTROL_ID_OID) > VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" ha tirado un > error : violación del restricción de integridad: restricción ('check') NOT > NULL; SYS_CT_11646 table: RISK column: "NAME" > > > ------------------------- > > Despite that, the this.persist(risk) code is executed without throwing an > exception. > > > > The problem with the seems to be related to the current > "executeWithinTransaction()" implementation: > > public class IsisTransactionManager implements SessionScopedComponent { > > ... > > public <Q> Q executeWithinTransaction(final > TransactionalClosureWithReturn<Q> closure) { > final boolean initiallyInTransaction = inTransaction(); > if (!initiallyInTransaction) { > startTransaction(); > } > try { > closure.preExecute(); > final Q retVal = closure.execute(); > closure.onSuccess(); > if (!initiallyInTransaction) { > endTransaction(); > } > return retVal; > } catch (final RuntimeException ex) { > closure.onFailure(); > if (!initiallyInTransaction) { > abortTransaction(); > } > throw ex; > } > } > > > As my current "closure" implementation does not have any code on the > "onFailure()" method: > > @Programmatic > public <S extends AbstractXMSDomainObject> List<S> findByProp( > final Class<S> clazz, final String whereClause, > final Integer firstResult, final Integer > maxResults, > final String orderClause) { > return > IsisContext.getTransactionManager().executeWithinTransaction( > new > TransactionalClosureWithReturnAbstract<List<S>>() { > > @Override > public List<S> execute() { > return > AbstractXMSDomainObjectRepositoryAndFactory.this > > .doFindByProp(clazz, whereClause, firstResult, > > maxResults, orderClause); > } > }); > > } > > > The "closure.onFailure()" does nothing, and the exception is shadowed. So > no exception is thrown by the "persist()" method. > > But for this to happen, seems to imply that the object has not been > validated before sending it to the persistence manager. I understand that > it should be validated by Isis before sending to the database. > > > So basically, I have the following problems: > > 1. Domain Object not validated by Isis before being sent to the database > (executed within a BDD test; perhaps that's relevant). > > 2. Not sure if I could/should throw an exception on the "onFailure()" > closure (as the Isis transaction wouldn't be aborted). > > 3. I would expect to be able to know the Runtime Exception that has > originated the failure. > > > > And I would propose the following changes to current Isis implementation: > > - It would imply to change IsisTransactionManager current implementation. > - If no code should be broken for avoiding major version update if > semantic versioning is followed, a descendant of > TransactionalClosureWithReturn could be defined with a new method > "onFailureWithReason(RuntimeException runtimeException)". > - Also, if an exception can be raised on any "onFailureXXX()" > implementation, protect the abortTransaction(); code inside a try - finally > block). > - I don't expect that any corrective action will need a transaction. If > that can be expected in other use cases, the "onFailure()" method could > return a Boolean parameter to indicate if the Isis transaction must also be > aborted and the current IsisTransactionManager should be modify in > accordance. > > > Thanks, > > Oscar > > > >
