isis-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Stephen Cameron <steve.cameron...@gmail.com>
Subject Re: Datanucleus issues
Date Wed, 02 Sep 2015 13:18:51 GMT
Its obvious now, sorry for wasting your time. getProvider is in parent and
child.

On Wed, Sep 2, 2015 at 11:01 PM, Stephen Cameron <steve.cameron.62@gmail.com
> wrote:

> OK, I pushed the current versions to Github.
>
> https://github.com/Stephen-Cameron-Data-Services/isis-chats.git
>
> If you start the app and create a new Activity (an ActivityEvent object)
> from the main menu you will see the error. I have no tests independant of
> the webapp sorry.
>
> I'll have to call it a day here soon, but it would be great if you could
> have a quick look, just to see if something pops out for you that I am
> missing. It must be something about that relationship specifically, its the
> only one duplicated.
>
>
> On Wed, Sep 2, 2015 at 10:51 PM, Stephen Cameron <
> steve.cameron.62@gmail.com> wrote:
>
>> I'll check in what I have now, but the issue is simply that an identical
>> foreign key is being created twice for some reason. I thought it might be
>> an artifact of there being two child tables. It had me confused as I didn't
>> change much to what was working, including the relationship Activity to
>> Provider.
>>
>> Here is the log, you can see activity_FK3 and activity_FK7 are the same:
>>
>> 22:16:33,740  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 1 ms
>> 22:16:33,743  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK3" in catalog "" schema ""
>> 22:16:33,743  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK3" FOREIGN KEY
>> ("provider_id_OID") REFERENCES "Provider" ("id")
>> 22:16:33,745  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 2 ms
>> 22:16:33,745  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK4" in catalog "" schema ""
>> 22:16:33,745  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK4" FOREIGN KEY
>> ("region_region_OID") REFERENCES "Region" ("region")
>> 22:16:33,746  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 1 ms
>> 22:16:33,746  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK1" in catalog "" schema ""
>> 22:16:33,746  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK1" FOREIGN KEY
>> ("activityType_name_OID") REFERENCES "ActivityType" ("name")
>> 22:16:33,747  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 1 ms
>> 22:16:33,747  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK2" in catalog "" schema ""
>> 22:16:33,748  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK2" FOREIGN KEY
>> ("location_location_OID") REFERENCES "Location" ("location")
>> 22:16:33,749  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 1 ms
>> 22:16:33,749  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK7" in catalog "" schema ""
>> 22:16:33,749  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK7" FOREIGN KEY
>> ("provider_id_OID") REFERENCES "Provider" ("id")
>> 22:16:33,761  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK5" in catalog "" schema ""
>> 22:16:33,761  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK5" FOREIGN KEY
>> ("parent_RecurringActivity_ID_OID") REFERENCES "RecurringActivity"
>> ("RecurringActivity_ID")
>> 22:16:33,763  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 2 ms
>> 22:16:33,763  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Creating foreign key constraint : "activity_FK6" in catalog "" schema ""
>> 22:16:33,763  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> ALTER TABLE "activity" ADD CONSTRAINT "activity_FK6" FOREIGN KEY
>> ("parentActivity_RecurringActivity_ID_OID") REFERENCES "RecurringActivity"
>> ("RecurringActivity_ID")
>> 22:16:33,765  [Schema               275150920@qtp-1846345504-0 DEBUG]
>> Execution Time = 2 ms
>>
>> On Wed, Sep 2, 2015 at 10:42 PM, Jeroen van der Wal <jeroen@stromboli.it>
>> wrote:
>>
>>> Hi Stephen, you're leaving so much to guess. Can you put your code or
>>> part
>>> of it on github?
>>>
>>> Cheers,
>>>
>>> Jeroen
>>>
>>> On 2 September 2015 at 13:38, Stephen Cameron <
>>> steve.cameron.62@gmail.com>
>>> wrote:
>>>
>>> > Hi again,
>>> >
>>> > I am back to trying to resolve my original issues, before being
>>> sidetracked
>>> > with the abstract class problem. I've not yet got a simple test case
>>> for
>>> > this, but will create one if no-one can give me a solution strait off.
>>> >
>>> > It seems as if foreign keys are being created twice. The stack trace is
>>> > below.
>>> >
>>> > I have 4 tables now two abstract and two concrete, one abstract class
>>> > extends the other and the two concrete classes extend the second
>>> abstract
>>> > ctype.
>>> >
>>> > These are:
>>> >
>>> > @PersistenceCapable()
>>> > @Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
>>> > @Discriminator(strategy=DiscriminatorStrategy.CLASS_NAME,
>>> column="class")
>>> > public abstract class AbstractChatsDomainEntity {...}
>>> >
>>> > @PersistenceCapable(table="activity")
>>> > @Inheritance(strategy = InheritanceStrategy.NEW_TABLE)
>>> > @Discriminator(strategy=DiscriminatorStrategy.CLASS_NAME,
>>> column="class")
>>> > public abstract class AbstractActivity extends
>>> AbstractChatsDomainEntity
>>> > implements Activity, Comparable<Activity> {...}
>>> >
>>> > @PersistenceCapable()
>>> > @Inheritance(strategy = InheritanceStrategy.SUPERCLASS_TABLE)
>>> > @DomainObject(objectType = "ACTIVITY")
>>> > @DomainObjectLayout(bookmarking = BookmarkPolicy.AS_ROOT)
>>> > public class ActivityEvent extends AbstractActivity implements
>>> > CalendarEventable {...}
>>> >
>>> > @PersistenceCapable()
>>> > @Inheritance(strategy = InheritanceStrategy.SUPERCLASS_TABLE)
>>> > @DomainObject(objectType = "RECURRING_ACTIVITY")
>>> > @DomainObjectLayout(bookmarking = BookmarkPolicy.AS_ROOT)
>>> > public class RecurringActivity extends AbstractActivity {...}
>>> >
>>> > I'll remove one of these concrete classes temporarily and see what
>>> happens.
>>> >
>>> > 21:17:28,766  [Datastore            421163163@qtp-899376395-0 ERROR]
>>> An
>>> > exception was thrown while adding/validating class(es) : a FOREIGN KEY
>>> > constraint already exists on the set of columns: "activity_FK7" in
>>> > statement [ALTER TABLE "activity" ADD CONSTRAINT "activity_FK7"
>>> FOREIGN KEY
>>> > ("provider_id_OID") REFERENCES "Provider" ("id") ]
>>> > java.sql.SQLSyntaxErrorException: a FOREIGN KEY constraint already
>>> exists
>>> > on the set of columns: "activity_FK7" in statement [ALTER TABLE
>>> "activity"
>>> > ADD CONSTRAINT "activity_FK7" FOREIGN KEY ("provider_id_OID")
>>> REFERENCES
>>> > "Provider" ("id") ]
>>> >     at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
>>> >     at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
>>> >     at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
>>> >     at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.datasource.dbcp.DelegatingStatement.execute(DelegatingStatement.java:246)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.datasource.dbcp.DelegatingStatement.execute(DelegatingStatement.java:246)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.table.AbstractTable.executeDdlStatement(AbstractTable.java:879)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.table.TableImpl.createForeignKeys(TableImpl.java:522)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.table.TableImpl.createConstraints(TableImpl.java:426)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.performTablesValidation(RDBMSStoreManager.java:3443)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2880)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:119)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1612)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:675)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSPersistenceHandler.getDatastoreClass(RDBMSPersistenceHandler.java:88)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.store.rdbms.RDBMSPersistenceHandler.insertObject(RDBMSPersistenceHandler.java:123)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.state.StateManagerImpl.internalMakePersistent(StateManagerImpl.java:3363)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3339)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2066)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1909)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1764)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:720)
>>> >     at
>>> >
>>> >
>>> org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:745)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.objectstore.jdo.datanucleus.persistence.commands.DataNucleusCreateObjectCommand.execute(DataNucleusCreateObjectCommand.java:54)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.executeCommands(DataNucleusObjectStore.java:365)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.execute(DataNucleusObjectStore.java:359)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.core.runtime.system.transaction.IsisTransaction.doFlush(IsisTransaction.java:527)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.core.runtime.system.transaction.IsisTransaction.flush(IsisTransaction.java:473)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.flushTransaction(IsisTransactionManager.java:392)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionOnTargetAndProcessResults(ActionPanel.java:249)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionAndProcessResults(ActionPanel.java:193)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormPanel$ActionParameterForm$1.onSubmit(ActionParametersFormPanel.java:145)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.ajax.markup.html.form.AjaxButton$1.onSubmit(AjaxButton.java:108)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.ajax.form.AjaxFormSubmitBehavior$1.onSubmit(AjaxFormSubmitBehavior.java:182)
>>> >     at
>>> > org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1266)
>>> >     at org.apache.wicket.markup.html.form.Form.process(Form.java:938)
>>> >     at
>>> > org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:770)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.ajax.form.AjaxFormSubmitBehavior.onEvent(AjaxFormSubmitBehavior.java:159)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.ajax.AjaxEventBehavior.respond(AjaxEventBehavior.java:124)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.ajax.AbstractDefaultAjaxBehavior.onRequest(AbstractDefaultAjaxBehavior.java:633)
>>> >     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:497)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.RequestListenerInterface.internalInvoke(RequestListenerInterface.java:258)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:241)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.invokeListener(ListenerInterfaceRequestHandler.java:250)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.core.request.handler.ListenerInterfaceRequestHandler.respond(ListenerInterfaceRequestHandler.java:236)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:862)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.request.RequestHandlerStack.execute(RequestHandlerStack.java:64)
>>> >     at
>>> >
>>> org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:261)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:218)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:289)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:259)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
>>> >     at
>>> >
>>> >
>>> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
>>> >     at
>>> >
>>> >
>>> org.apache.isis.core.webapp.diagnostics.IsisLogOnExceptionFilter.doFilter(IsisLogOnExceptionFilter.java:52)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
>>> >     at
>>> >
>>> >
>>> org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
>>> >     at
>>> >
>>> org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
>>> >     at
>>> >
>>> org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>>> >     at
>>> >
>>> org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
>>> >     at
>>> >
>>> org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
>>> >     at
>>> > org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
>>> >     at
>>> >
>>> org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
>>> >     at org.mortbay.jetty.Server.handle(Server.java:326)
>>> >     at
>>> > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
>>> >     at
>>> >
>>> >
>>> org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
>>> >     at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
>>> >     at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
>>> >     at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
>>> >     at
>>> >
>>> >
>>> org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
>>> >     at
>>> >
>>> >
>>> org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
>>> > Caused by: org.hsqldb.HsqlException: a FOREIGN KEY constraint already
>>> > exists on the set of columns: "activity_FK7"
>>> >     at org.hsqldb.error.Error.error(Unknown Source)
>>> >     at org.hsqldb.error.Error.error(Unknown Source)
>>> >     at org.hsqldb.TableWorks.checkCreateForeignKey(Unknown Source)
>>> >     at org.hsqldb.TableWorks.addForeignKey(Unknown Source)
>>> >     at org.hsqldb.StatementSchema.getResult(Unknown Source)
>>> >     at org.hsqldb.StatementSchema.execute(Unknown Source)
>>> >     at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
>>> >     at org.hsqldb.Session.executeDirectStatement(Unknown Source)
>>> >     at org.hsqldb.Session.execute(Unknown Source)
>>> >     ... 81 more
>>> >
>>> >
>>> > On Wed, Sep 2, 2015 at 9:24 AM, Stephen Cameron <
>>> > steve.cameron.62@gmail.com>
>>> > wrote:
>>> >
>>> > >
>>> > > Hi
>>> > >
>>> > > Your solution ends up doing what mine does at the database schema
>>> level.
>>> > >
>>> > > If Datanucleus supports it then shouldn't it be mostly be fine in
>>> Isis?
>>> > If
>>> > > not then Isis should warn.
>>> > >
>>> > > I appreciate your help.
>>> > >
>>> > >
>>> > >
>>> > >
>>> > > On Wed, Sep 2, 2015 at 4:58 AM, Jeroen van der Wal <
>>> jeroen@stromboli.it>
>>> > > wrote:
>>> > >
>>> > >> I've never used @PrimaryKey in an Isis application, don't know
if
>>> that
>>> > >> works. My abstract class would typically look like this:
>>> > >>
>>> > >> @PersistenceCapable(identityType = IdentityType.DATASTORE)
>>> > >> @DatastoreIdentity(column = "id", strategy =
>>> > IdGeneratorStrategy.IDENTITY)
>>> > >> @Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
>>> > >> public abstract class AbstractParentType {
>>> > >>
>>> > >>     private String name;
>>> > >>
>>> > >>     @Column(allowsNull="true")
>>> > >>     @MemberOrder(sequence = "1")
>>> > >>     public String getName() {
>>> > >>         return name;
>>> > >>     }
>>> > >>
>>> > >>     public void setName(final String name) {
>>> > >>         this.name = name;
>>> > >>     }
>>> > >>
>>> > >> }
>>> > >>
>>> > >> Hth
>>> > >>
>>> > >> On 1 September 2015 at 20:44, Jeroen van der Wal <
>>> jeroen@stromboli.it>
>>> > >> wrote:
>>> > >>
>>> > >> > If you make your abstract class public it should work fine
;-)
>>> > >> >
>>> > >> > Cheers,
>>> > >> >
>>> > >> > Jeroen
>>> > >> >
>>> > >> > On 1 September 2015 at 15:12, Stephen Cameron <
>>> > >> steve.cameron.62@gmail.com>
>>> > >> > wrote:
>>> > >> >
>>> > >> >> Here a two scenarios each with a Parent and Child Type,
they
>>> should
>>> > >> give
>>> > >> >> the same result
>>> > >> >>
>>> > >> >> 1. Concrete Parent Type
>>> > >> >>
>>> > >> >> @PersistenceCapable()
>>> > >> >> public class ConcreteParentType {
>>> > >> >>
>>> > >> >>     @PrimaryKey()
>>> > >> >>     @Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
>>> > >> >>     private Long id;
>>> > >> >>
>>> > >> >>     private String name;
>>> > >> >>
>>> > >> >>     @Column(allowsNull="true")
>>> > >> >>     @MemberOrder(sequence = "1")
>>> > >> >>     public String getName() {
>>> > >> >>         return name;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>     public void setName(final String name) {
>>> > >> >>         this.name = name;
>>> > >> >>     }
>>> > >> >>
>>> > >> >> }
>>> > >> >>
>>> > >> >> @PersistenceCapable()
>>> > >> >> public class ChildTypeOfConcreteParentType extends
>>> > ConcreteParentType {
>>> > >> >>
>>> > >> >>
>>> > >> >>     private String description;
>>> > >> >>
>>> > >> >>     @Column(allowsNull="true")
>>> > >> >>     @MemberOrder(sequence = "2")
>>> > >> >>     public String getDescription() {
>>> > >> >>         return description;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>     public void setDescription(final String description)
{
>>> > >> >>         this.description = description;
>>> > >> >>     }
>>> > >> >>
>>> > >> >> }
>>> > >> >>
>>> > >> >> 2. Abstract Parent Type
>>> > >> >>
>>> > >> >> @PersistenceCapable()
>>> > >> >> @Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
>>> > >> >> abstract class AbstractParentType {
>>> > >> >>
>>> > >> >>     @PrimaryKey()
>>> > >> >>     @Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
>>> > >> >>     private Long id;
>>> > >> >>
>>> > >> >>     private String name;
>>> > >> >>
>>> > >> >>     @Column(allowsNull="true")
>>> > >> >>     @MemberOrder(sequence = "1")
>>> > >> >>     public String getName() {
>>> > >> >>         return name;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>     public void setName(final String name) {
>>> > >> >>         this.name = name;
>>> > >> >>     }
>>> > >> >>
>>> > >> >> }
>>> > >> >>
>>> > >> >> @PersistenceCapable()
>>> > >> >> public class ChildTypeOfAbstractParentType extends
>>> > AbstractParentType {
>>> > >> >>
>>> > >> >>     private String description;
>>> > >> >>
>>> > >> >>     @Column(allowsNull="true")
>>> > >> >>     @MemberOrder(sequence = "2")
>>> > >> >>     public String getDescription() {
>>> > >> >>         return description;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>     public void setDescription(final String description)
{
>>> > >> >>         this.description = description;
>>> > >> >>     }
>>> > >> >>
>>> > >> >> }
>>> > >> >>
>>> > >> >> In the seond scenario the name property doesn't appear,
only the
>>> > >> >> description.
>>> > >> >>
>>> > >> >> The DomainService class for testing these two scenarios
in the
>>> viewer
>>> > >> is
>>> > >> >> this:
>>> > >> >>
>>> > >> >> @DomainService(nature=NatureOfService.VIEW_MENU_ONLY)
>>> > >> >> @DomainServiceLayout(named = "DataNucleus", menuBar =
>>> > MenuBar.PRIMARY,
>>> > >> >> menuOrder = "100")
>>> > >> >> public class Menu {
>>> > >> >>
>>> > >> >>
>>> > >> >>
>>> > >> >>     public ChildTypeOfConcreteParentType
>>> > >> >> createChildTypeOfConcreteParentType() {
>>> > >> >>         ChildTypeOfConcreteParentType childType = null;
>>> > >> >>         try {
>>> > >> >>             childType =
>>> > >> >>
>>> container.newTransientInstance(ChildTypeOfConcreteParentType.class);
>>> > >> >>             childType.setName("ChildTypeOfConcreteParentType");
>>> > >> >>             childType.setDescription("something descriptive");
>>> > >> >>             container.persistIfNotAlready(childType);
>>> > >> >>         } catch (Exception e) {
>>> > >> >>             e.printStackTrace();
>>> > >> >>         }
>>> > >> >>         return childType;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>     public ChildTypeOfAbstractParentType
>>> > >> >> createChildTypeOfAbstractParentType() {
>>> > >> >>         ChildTypeOfAbstractParentType childType = null;
>>> > >> >>         try {
>>> > >> >>             childType =
>>> > >> >>
>>> container.newTransientInstance(ChildTypeOfAbstractParentType.class);
>>> > >> >>             childType.setName("ChildTypeOfAbstractParentType");
>>> > >> >>             childType.setDescription("something descriptive");
>>> > >> >>             container.persistIfNotAlready(childType);
>>> > >> >>         } catch (Exception e) {
>>> > >> >>             e.printStackTrace();
>>> > >> >>         }
>>> > >> >>         return childType;
>>> > >> >>     }
>>> > >> >>
>>> > >> >>
>>> > >> >>
>>> > >> >>     @javax.inject.Inject
>>> > >> >>     DomainObjectContainer container;
>>> > >> >>
>>> > >> >> }
>>> > >> >>
>>> > >> >>
>>> > >> >> On Tue, Sep 1, 2015 at 10:42 PM, Stephen Cameron <
>>> > >> >> steve.cameron.62@gmail.com
>>> > >> >> > wrote:
>>> > >> >>
>>> > >> >> > Hi Jeroen, just noticed this after sending second
update
>>> (winge).
>>> > >> >> >
>>> > >> >> > I'll send a test case now.
>>> > >> >> >
>>> > >> >> > On Tue, Sep 1, 2015 at 10:29 PM, Jeroen van der Wal
<
>>> > >> >> jeroen@stromboli.it>
>>> > >> >> > wrote:
>>> > >> >> >
>>> > >> >> >> Hi Stephen,
>>> > >> >> >>
>>> > >> >> >> Can you share some code to support your case?
>>> > >> >> >>
>>> > >> >> >> Cheers,
>>> > >> >> >>
>>> > >> >> >> Jeroen
>>> > >> >> >>
>>> > >> >> >> On 1 September 2015 at 12:39, Stephen Cameron
<
>>> > >> >> steve.cameron.62@gmail.com
>>> > >> >> >> >
>>> > >> >> >> wrote:
>>> > >> >> >>
>>> > >> >> >> > Hi,
>>> > >> >> >> >
>>> > >> >> >> > I've been trying today to find solutions
to what seem to be
>>> > >> >> Datanucleus
>>> > >> >> >> > issues, but without much success. So rather
than solve the
>>> > >> problems
>>> > >> >> >> created
>>> > >> >> >> > in my refactoring of my application, which
has been too hard
>>> > >> frankly,
>>> > >> >> >> I'm
>>> > >> >> >> > trying to start afresh with some simple
test cases, show
>>> these
>>> > >> work,
>>> > >> >> >> then
>>> > >> >> >> > add more complexity till I get where I want
to be.
>>> > >> >> >> >
>>> > >> >> >> > So, I am starting this approach and I immediately
have an
>>> issue,
>>> > >> but
>>> > >> >> >> not a
>>> > >> >> >> > Datanucleus one, I find that the value properties
of an
>>> abstract
>>> > >> >> parent
>>> > >> >> >> > class don't appear in the Wicket viewer,
whereas they do if
>>> the
>>> > >> >> parent
>>> > >> >> >> > class is concrete. Is this correct and if
so what is the
>>> reason?
>>> > >> >> >> >
>>> > >> >> >> > Thanks.
>>> > >> >> >> >
>>> > >> >> >>
>>> > >> >> >
>>> > >> >> >
>>> > >> >>
>>> > >> >
>>> > >> >
>>> > >>
>>> > >
>>> > >
>>> >
>>>
>>
>>
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message