Hi all.
I'm implementing the new support for automatic simple and collection properties
change events (@PostsPropertyChangedEvent, @ PostsCollectionAddedToEvent,
@PostsCollectionRemovedFromEvent) and the new mechanism works really nice :-))
I've just initially forgot to register the service as an event subscriber,
thinking that it was unnecessary. So perhaps auto-registering the service when
"detecting" the guava's @Subscribe annotation would be a good enhancement.
I've found that an exception thrown by DN has been hidden by Isis.
The root-cause is because I have not properly defined the @Inheritance mappings
correctly, but the relevant thing from Isis perspective is that DN does not
throw any exception if, on a collection annotated with @Join, the "add" is not
properly executed.
For example, given:
// {{ AggregatedServices (Collection)
@Persistent(table = "Product_Aggregates_Service")
@Join(column = "Product")
@Element(column = "Service", types = Service.class)
private SortedSet<Service> aggregatedServices = new TreeSet<Service>();
@PostsCollectionRemovedFromEvent(AssetCollectionWithRelationshipRemovedFromEvent.class)
@XMSField(locales = { @XMSLocale(locale = "es", caption = "Servicios de
Negocio Agregados") })
@XMSRel(role = RelationshipRole.SOURCE, type = RelationshipType.AGGREGATION)
@MemberOrder(sequence = "550")
public SortedSet<Service> getAggregatedServices() {
return this.aggregatedServices;
}
public void setAggregatedServices(final SortedSet<Service>
aggregatedServices) {
this.aggregatedServices = aggregatedServices;
}
public void addToAggregatedServices(final Service service) {
this.getAggregatedServices().add(service);
this.getContainer().flush();
}
public void removeFromAggregatedServices(final Service service) {
this.getAggregatedServices().remove(service);
this.getContainer().flush();
}
// }}
When the
this.getAggregatedServices().add(service);
Is called, the following exception occurs:
10:12:14,537 [Persistence main WARN ] Execuci�n del metodo
"add" en el campo "aggregatedServices" ha causado un error : Solicitud de
a�adir ha fallado : INSERT INTO PRODUCT_AGGREGATES_SERVICE (PRODUCT,SERVICE)
VALUES (?,?)
Solicitud de a�adir ha fallado : INSERT INTO PRODUCT_AGGREGATES_SERVICE
(PRODUCT,SERVICE) VALUES (?,?)
org.datanucleus.exceptions.NucleusDataStoreException: Solicitud de a�adir ha
fallado : INSERT INTO PRODUCT_AGGREGATES_SERVICE (PRODUCT,SERVICE) VALUES (?,?)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.add(JoinSetStore.java:349)
at org.datanucleus.store.types.backed.TreeSet.add(TreeSet.java:716)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product.addToAggregatedServices(Product.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.apache.isis.core.commons.lang.MethodExtensions.invoke(MethodExtensions.java:53)
at
org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils.invoke(AdapterInvokeUtils.java:49)
at
org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils.invoke(AdapterInvokeUtils.java:53)
at
org.apache.isis.core.progmodel.facets.collections.modify.CollectionAddToFacetViaMethod.add(CollectionAddToFacetViaMethod.java:67)
at
org.apache.isis.core.runtime.transaction.facets.CollectionAddToFacetWrapTransaction$1.execute(CollectionAddToFacetWrapTransaction.java:55)
at
org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:176)
at
org.apache.isis.core.runtime.transaction.facets.CollectionAddToFacetWrapTransaction.add(CollectionAddToFacetWrapTransaction.java:52)
at
org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl.addElement(OneToManyAssociationImpl.java:179)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleCollectionAddToMethod(DomainObjectInvocationHandler.java:479)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:207)
at
org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product_$$_jvst4fc_11.addToAggregatedServices(Product_$$_jvst4fc_11.java)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product.addBusinessService(Product.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.internalInvoke(ActionInvocationFacetViaMethod.java:268)
at
org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:131)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:57)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:54)
at
org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:218)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:54)
at
org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:342)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:547)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:226)
at
org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product_$$_jvst4fc_11.addBusinessService(Product_$$_jvst4fc_11.java)
at
com.xms.framework.architecture.integration.tests.relationships.RelationshipsUpsertedFromAssetsPropertiesTest.testDirectAndDerivedRelationships(RelationshipsUpsertedFromAssetsPropertiesTest.java:184)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at
org.apache.isis.core.integtestsupport.IntegrationTestAbstract$IsisTransactionRule$1.evaluate(IntegrationTestAbstract.java:163)
at
org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2$1.evaluate(JUnitRuleMockery2.java:146)
at
org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
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.datanucleus.store.rdbms.exceptions.MappedDatastoreException:
INSERT INTO PRODUCT_AGGREGATES_SERVICE (PRODUCT,SERVICE) VALUES (?,?)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.doInternalAdd(JoinSetStore.java:754)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.internalAdd(JoinSetStore.java:502)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.add(JoinSetStore.java:333)
... 64 more
Caused by: java.sql.SQLIntegrityConstraintViolationException: violación del
restricción de integridad: no ha registro padre en clave foránea;
PRODUCT_AGGREGATES_SERVICE_FK1 table: PRODUCT_AGGREGATES_SERVICE
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
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.scostore.JoinSetStore.doInternalAdd(JoinSetStore.java:733)
... 66 more
Caused by: org.hsqldb.HsqlException: violación del restricción de integridad:
no ha registro padre en clave foránea; PRODUCT_AGGREGATES_SERVICE_FK1 table:
PRODUCT_AGGREGATES_SERVICE
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Constraint.getException(Unknown Source)
at org.hsqldb.Constraint.checkInsert(Unknown Source)
at org.hsqldb.StatementDML.performIntegrityChecks(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(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)
... 73 more
Nested Throwables StackTrace:
org.datanucleus.store.rdbms.exceptions.MappedDatastoreException: INSERT INTO
PRODUCT_AGGREGATES_SERVICE (PRODUCT,SERVICE) VALUES (?,?)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.doInternalAdd(JoinSetStore.java:754)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.internalAdd(JoinSetStore.java:502)
at
org.datanucleus.store.rdbms.scostore.JoinSetStore.add(JoinSetStore.java:333)
at org.datanucleus.store.types.backed.TreeSet.add(TreeSet.java:716)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product.addToAggregatedServices(Product.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.apache.isis.core.commons.lang.MethodExtensions.invoke(MethodExtensions.java:53)
at
org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils.invoke(AdapterInvokeUtils.java:49)
at
org.apache.isis.core.metamodel.adapter.util.AdapterInvokeUtils.invoke(AdapterInvokeUtils.java:53)
at
org.apache.isis.core.progmodel.facets.collections.modify.CollectionAddToFacetViaMethod.add(CollectionAddToFacetViaMethod.java:67)
at
org.apache.isis.core.runtime.transaction.facets.CollectionAddToFacetWrapTransaction$1.execute(CollectionAddToFacetWrapTransaction.java:55)
at
org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:176)
at
org.apache.isis.core.runtime.transaction.facets.CollectionAddToFacetWrapTransaction.add(CollectionAddToFacetWrapTransaction.java:52)
at
org.apache.isis.core.metamodel.specloader.specimpl.OneToManyAssociationImpl.addElement(OneToManyAssociationImpl.java:179)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleCollectionAddToMethod(DomainObjectInvocationHandler.java:479)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:207)
at
org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product_$$_jvst4fc_11.addToAggregatedServices(Product_$$_jvst4fc_11.java)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product.addBusinessService(Product.java:80)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.internalInvoke(ActionInvocationFacetViaMethod.java:268)
at
org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:131)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:57)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:54)
at
org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:218)
at
org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:54)
at
org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:342)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:547)
at
org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:226)
at
org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52)
at
com.xms.framework.architecture.domain.model.business.extensions.product.Product_$$_jvst4fc_11.addBusinessService(Product_$$_jvst4fc_11.java)
at
com.xms.framework.architecture.integration.tests.relationships.RelationshipsUpsertedFromAssetsPropertiesTest.testDirectAndDerivedRelationships(RelationshipsUpsertedFromAssetsPropertiesTest.java:184)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at
org.apache.isis.core.integtestsupport.IntegrationTestAbstract$IsisTransactionRule$1.evaluate(IntegrationTestAbstract.java:163)
at
org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2$1.evaluate(JUnitRuleMockery2.java:146)
at
org.junit.rules.ExpectedException$ExpectedExceptionStatement.evaluate(ExpectedException.java:168)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
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: java.sql.SQLIntegrityConstraintViolationException: violación del
restricción de integridad: no ha registro padre en clave foránea;
PRODUCT_AGGREGATES_SERVICE_FK1 table: PRODUCT_AGGREGATES_SERVICE
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
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.scostore.JoinSetStore.doInternalAdd(JoinSetStore.java:733)
... 66 more
Caused by: org.hsqldb.HsqlException: violación del restricción de integridad:
no ha registro padre en clave foránea; PRODUCT_AGGREGATES_SERVICE_FK1 table:
PRODUCT_AGGREGATES_SERVICE
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Constraint.getException(Unknown Source)
at org.hsqldb.Constraint.checkInsert(Unknown Source)
at org.hsqldb.StatementDML.performIntegrityChecks(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(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)
... 73 more
But DN does not throw any exception. It simply returns false when exiting the
this.getAggregatedServices().add(service);
method ...
The DN implementation is on [1].
So seems that it's mandatory to evaluate the result of "add" !!!!
I understand that an ApplicationException should be raised in all cases. What
would be a convenient "idiom" we can all use?
Thanks,
Oscar
[1]
https://github.com/datanucleus/datanucleus-core/blob/master/src/main/java/org/datanucleus/store/types/wrappers/backed/TreeSet.java#L719