You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jdo-dev@db.apache.org by Tilmann Zäschke <za...@gmx.de> on 2016/05/30 13:10:38 UTC

EmbeddedPCMapping cannot be cast to PersistableMapping

Dear all,

I'm trying to implement the schema for the new Optional test, but I keep 
running into a ClassCastException:

javax.jdo.JDOFatalInternalException: Failed to generate new Mapping of 
type org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception 
: Failed to generate new Mapping of type 
org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : 
org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be 
cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
java.lang.ClassCastException: 
org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be 
cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
     at 
org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
     at 
org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
     ....

I'm not mentioning 'embedded' anywhere, so I'm not sure where this 
assumption of 'embedding' comes from. I do have Fields of type 'Object', 
but other tests also don't seem to require embedded=false or similar to 
handle field of type Object that reference PCs.

I'm also not even sure (or how I can find out) which of my mapping files 
are wrong. The error is the same for application-identity and 
datastore-identity. It occurs wile calling makePersistent().
I'm using the latest 'trunk' of the JDO TCK.

I also also consistently get the following error, but it seems to be a 
different issue:
 >> Error copying implementation log file: Source 
'C:\Users\ztilmann\Desktop\projects\workspace-jdo\JDO\tck\datanucleus.txt' 
does not exist


Could anyone have a look and tell me what I'm doing wrong? I can also 
provide if the mistake is not obvious. Code snippets are below.

Cheers,
Tilmann


Code snippet (error occurs in last line in makePersistent):

     @Override
     protected void localSetUp() {
         addTearDownClass(OptionalSample.class);
         insertOptionalSample(getPM());
     }

     private void insertOptionalSample(PersistenceManager pm) {
         Transaction tx = pm.currentTransaction();
         try {
             tx.begin();

             //create a dummy object as target
             OptionalSample dummyPC = new OptionalSample();
             dummyPC.setId(DUMMY_ID);
             pm.makePersistent(dummyPC);
             ...
         }
     }



Here are the schemas:

public class OptionalSample {
     long id;

     Optional<OptionalSample> optionalPC;
     Optional<?> optionalAny;
     @SuppressWarnings("rawtypes")
     Optional optionalNoGenerics;
     Object any;

     Optional<Date> optionalDate;
     Optional<Integer> optionalInteger;
     Optional<String> optionalString;

     ...
}


package.jdo
==========

     <class name="OptionalSample" identity-type="application">
       <field name="id" primary-key="true"/>
       <field name="optionalPC"
field-type="org.apache.jdo.tck.pc.query.OptionalSample"
                        persistence-modifier="persistent"/>
       <field name="optionalDate" persistence-modifier="persistent"/>
       <field name="optionalInteger" persistence-modifier="persistent"/>
       <field name="optionalString" persistence-modifier="persistent"/>
       <field name="optionalAny" persistence-modifier="persistent" 
embedded="false"
field-type="org.apache.jdo.tck.pc.query.OptionalSample">
       </field>
       <field name="optionalNoGenerics" 
persistence-modifier="persistent" embedded="false"
field-type="org.apache.jdo.tck.pc.query.OptionalSample">
       </field>
       <field name="any" persistence-modifier="persistent" embedded="false"
field-type="org.apache.jdo.tck.pc.query.OptionalSample">
       </field>
     </class>


package-standard.orm:
=====================

    <class name="OptionalSample" table="OptionalSample">
       <field name="id" column="ID"/>
       <field name="optionalPC">
         <column name="OPTIONAL_PC"/>
         <foreign-key/>
       </field>
       <field name="optionalDate">
         <column name="OPTIONAL_DATE"/>
       </field>
       <field name="optionalInteger">
         <column name="OPTIONAL_INTEGER"/>
       </field>
       <field name="optionalString">
         <column name="OPTIONAL_STRING"/>
       </field>
       <field name="optionalAny" column="OPTIONAL_ANY">
         <foreign-key/>
       </field>
       <field name="optionalNoGenerics" column="OPTIONAL_NO_GENERICS">
         <foreign-key/>
       </field>
       <field name="any" column="OBJECT_ANY">
         <foreign-key/>
       </field>
     </class>


schema.sql
==========

CREATE TABLE OptionalSample (
     ID INTEGER NOT NULL,
     OPTIONAL_PC INTEGER REFERENCES SIMPLE_CLASS,
     OPTIONAL_DATE DATE,
     OPTIONAL_LONG BIGINT,
     OPTIONAL_STRING VARCHAR(255),
     OPTIONAL_ANY INTEGER REFERENCES SIMPLE_CLASS,
     OPTIONAL_NO_GENERICS INTEGER REFERENCES SIMPLE_CLASS,
     OBJECT_ANY INTEGER REFERENCES SIMPLE_CLASS,
     CONSTRAINT OPTIONALSAMPLE_PK PRIMARY KEY (ID)
);


Full exception:
=============

1) 
testParameterOptionalWithEmptyFields(org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods)javax.jdo.JDOFatalInternalException: 
Failed to generate new Mapping of type 
org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception : 
Failed to generate new Mapping of type 
org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : 
org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be 
cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
java.lang.ClassCastException: 
org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be 
cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
     at 
org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
     at 
org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
     at 
org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.prepareDatastoreMapping(ReferenceMapping.java:229)
     at 
org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.initialize(ReferenceMapping.java:104)
     at 
org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
     at 
org.datanucleus.store.rdbms.mapping.java.SingleCollectionMapping.initialize(SingleCollectionMapping.java:57)
     at 
org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
     at 
org.datanucleus.store.rdbms.table.ClassTable.manageMembers(ClassTable.java:529)
     at 
org.datanucleus.store.rdbms.table.ClassTable.manageClass(ClassTable.java:435)
     at 
org.datanucleus.store.rdbms.table.ClassTable.initializeForClass(ClassTable.java:1205)
     at 
org.datanucleus.store.rdbms.table.ClassTable.initialize(ClassTable.java:275)
     at 
org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.initializeClassTables(RDBMSStoreManager.java:3298)
     at 
org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2907)
     at 
org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:118)
     at 
org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1644)
     at 
org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:676)
     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:3367)
     at 
org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3343)
     at 
org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2079)
     at 
org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1922)
     at 
org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1777)
     at 
org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:703)
     at 
org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:729)
     at 
org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.insertOptionalSample(SupportedOptionalMethods.java:498)
     at 
org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.localSetUp(SupportedOptionalMethods.java:486)
     at org.apache.jdo.tck.JDO_Test.setUp(JDO_Test.java:267)
     at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:283)
     at 
org.apache.jdo.tck.util.BatchTestRunner.doRun(BatchTestRunner.java:108)
     at 
org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:148)
     at 
org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:123)








Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Tilmann Zäschke <za...@gmx.de>.
The test mostly passes now. There are some issues, we should probably 
discuss them on Friday:

a)
SELECT FROM org.apache.jdo.tck.pc.query.OptionalSample WHERE 
!(optionalPC != null)
fails with
java.sql.SQLSyntaxErrorException: Syntax error: Encountered "NOT" at 
line 1, column 185

-> I think double negation is legal, would you agree?


b)
     query #1=  "optionalPC.id == " + DUMMY_ID
     query #2=  "optionalPC.get().id == " + DUMMY_ID
-> I think both queries should return the same result, but instead the 
second query returns the object with 'id=DUMMY_ID', not the one that 
refrerences the object with id=DUMMY_ID.

c) Optional.orElse is currently not supported. I think the proposal was 
to support this, but we discuss this on Friday:
"org.datanucleus.exceptions.NucleusUserException: Invocation of method 
"orElse" on "java.util.Optional" is not supported"


d) query: "optionalPC == null"
 From this comment 
(https://issues.apache.org/jira/browse/JDO-751?focusedCommentId=15154475&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15154475) 
by Craig (Feb 19, 16:44) my understanding was that this should only 
return objects with 'optionalPC==null', but _not_ objects with 
'optionalPC.isEmpty()'.
However we can discuss this on Friday.

A related problem occurs with the query "!(optionalPC == null)"
This returns only objects where 'optionalPC.get() != null'.
My understanding was that it should also return with 
'optionalPC.isEmpty()', because the reference is not actually null.

 From the post, my understanding was that we always assume 
optional-shortcut form when comparing to an actual instance, but allow 
comparison with the 'reference to Optional' when copmparing to 'null'.

Again, we can discuss this.

I'll upload a patch with the latest version.

Best,
Tilmann


On 31-May-16 20:33, Craig Russell wrote:
>> On May 31, 2016, at 3:08 AM, Tilmann Zschke <za...@gmx.de> wrote:
>>
>> Hi,
>>
>>> More likely the problem is down to having a field as Optional<Object>
>> The test doesn't actually have Optional<Object>, but it does have:
>>
>> Optional<?> optionalAny;
>> Optional optionalNoGenerics;
>>
>> I suppose these would not be allowed either (because they are mostly equivalent to Optional<Object>)?
> Yes. Optional<?> and Optional are not of much interest (to me at least).
>
> I agree with Andy that supporting Object in an object model should be sufficiently flexible. Optional<Object> does not add any value to the model.
>
> In plain English, "Object can be any object. Optional<Object> can be anything but with some special behavior about nullability"???
>
> Craig
>> Regards,
>> Tilmann
>>
>> On 31-May-16 11:53, Andy Jefferson wrote:
>>> Hi,
>>>> thanks. Indeed it seems that the error is triggered by declaring a field
>>>> as 'Optional'.
>>> That I doubt, due to established tests
>>> https://github.com/datanucleus/tests/blob/master/jdo/general/src/test/org/datanucleus/tests/types/OptionalTest.java
>>>
>>>
>>> More likely the problem is down to having a field as Optional<Object>, which is a minority interest use-case IMHO (which can often be symptomatic of a problem in a model, with lack of use of inheritance etc). Perhaps try nightly builds of jars if having problems.
>>>
>>>> Next step is likely to update the implementation.
>>> DataNucleus has supported Optional since 5.0.0-m1, and tested on Optional<{basic}>, Optional<PC> (see link). It hasn't been tested on Optional<Object> where Object refers to potentially multiple types of PC.
>>>
>>>
>>>
>>> Regards
>>
> Craig L Russell
> Architect
> craig.russell@oracle.com
> P.S. A good JDO? O, Gasp!
>
>
>
>
>


Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Craig Russell <cr...@oracle.com>.
> On May 31, 2016, at 3:08 AM, Tilmann Zäschke <za...@gmx.de> wrote:
> 
> Hi,
> 
>> More likely the problem is down to having a field as Optional<Object>
> 
> The test doesn't actually have Optional<Object>, but it does have:
> 
> Optional<?> optionalAny;
> Optional optionalNoGenerics;
> 
> I suppose these would not be allowed either (because they are mostly equivalent to Optional<Object>)?

Yes. Optional<?> and Optional are not of much interest (to me at least). 

I agree with Andy that supporting Object in an object model should be sufficiently flexible. Optional<Object> does not add any value to the model. 

In plain English, "Object can be any object. Optional<Object> can be anything but with some special behavior about nullability"???

Craig
> 
> Regards,
> Tilmann
> 
> On 31-May-16 11:53, Andy Jefferson wrote:
>> Hi,
>>> thanks. Indeed it seems that the error is triggered by declaring a field
>>> as 'Optional'.
>> That I doubt, due to established tests
>> https://github.com/datanucleus/tests/blob/master/jdo/general/src/test/org/datanucleus/tests/types/OptionalTest.java
>> 
>> 
>> More likely the problem is down to having a field as Optional<Object>, which is a minority interest use-case IMHO (which can often be symptomatic of a problem in a model, with lack of use of inheritance etc). Perhaps try nightly builds of jars if having problems.
>> 
>>> Next step is likely to update the implementation.
>> DataNucleus has supported Optional since 5.0.0-m1, and tested on Optional<{basic}>, Optional<PC> (see link). It hasn't been tested on Optional<Object> where Object refers to potentially multiple types of PC.
>> 
>> 
>> 
>> Regards
> 
> 

Craig L Russell
Architect
craig.russell@oracle.com
P.S. A good JDO? O, Gasp!






Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Tilmann Zäschke <za...@gmx.de>.
Hi,

> More likely the problem is down to having a field as Optional<Object>

The test doesn't actually have Optional<Object>, but it does have:

Optional<?> optionalAny;
Optional optionalNoGenerics;

I suppose these would not be allowed either (because they are mostly 
equivalent to Optional<Object>)?

Regards,
Tilmann

On 31-May-16 11:53, Andy Jefferson wrote:
> Hi,
>> thanks. Indeed it seems that the error is triggered by declaring a field
>> as 'Optional'.
> That I doubt, due to established tests
> https://github.com/datanucleus/tests/blob/master/jdo/general/src/test/org/datanucleus/tests/types/OptionalTest.java
>
>
> More likely the problem is down to having a field as Optional<Object>, which is a minority interest use-case IMHO (which can often be symptomatic of a problem in a model, with lack of use of inheritance etc). Perhaps try nightly builds of jars if having problems.
>
>> Next step is likely to update the implementation.
> DataNucleus has supported Optional since 5.0.0-m1, and tested on Optional<{basic}>, Optional<PC> (see link). It hasn't been tested on Optional<Object> where Object refers to potentially multiple types of PC.
>
>
>
> Regards



Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Andy Jefferson <an...@datanucleus.org>.
Hi,
> thanks. Indeed it seems that the error is triggered by declaring a field 
> as 'Optional'.

That I doubt, due to established tests
https://github.com/datanucleus/tests/blob/master/jdo/general/src/test/org/datanucleus/tests/types/OptionalTest.java


More likely the problem is down to having a field as Optional<Object>, which is a minority interest use-case IMHO (which can often be symptomatic of a problem in a model, with lack of use of inheritance etc). Perhaps try nightly builds of jars if having problems.

> Next step is likely to update the implementation.

DataNucleus has supported Optional since 5.0.0-m1, and tested on Optional<{basic}>, Optional<PC> (see link). It hasn't been tested on Optional<Object> where Object refers to potentially multiple types of PC.



Regards
-- 
Andy
DataNucleus (Web: http://www.datanucleus.org   Twitter: @datanucleus)

Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Tilmann Zäschke <za...@gmx.de>.
Hi Craig,
thanks. Indeed it seems that the error is triggered by declaring a field 
as 'Optional'.
I thought I had seen an update note that 'Optional' would be supported 
by the latest milestone of DataNucleus, but I can't find it anymore.

I uploaded the patch to JIRA.
Next step is likely to update the implementation.

Cheers,
Tilmann

On 30-May-16 21:31, Craig Russell wrote:
> Hi Tilmann,
>
>> On May 30, 2016, at 6:10 AM, Tilmann Z�schke <za...@gmx.de> wrote:
>>
>> Dear all,
>>
>> I'm trying to implement the schema for the new Optional test, but I keep running into a ClassCastException:
>>
>> javax.jdo.JDOFatalInternalException: Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception : Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>> java.lang.ClassCastException: org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>>     at org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
>>     at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
>>     ....
>>
>> I'm not mentioning 'embedded' anywhere, so I'm not sure where this assumption of 'embedding' comes from.
> I think that Optional itself is treated as embedded. I\u2019d investigate which field is causing the problem by trying, one at a time, Optional<?>, Optional<OptionalSample>, etc. and see whether any of these is ok.
>
> But is Optional even claimed to be supported by datanucleus? I haven\u2019t seen any mail on the subject\u2026
>
> Craig
>
>
>> I do have Fields of type 'Object', but other tests also don't seem to require embedded=false or similar to handle field of type Object that reference PCs.
>>
>> I'm also not even sure (or how I can find out) which of my mapping files are wrong. The error is the same for application-identity and datastore-identity. It occurs wile calling makePersistent().
>> I'm using the latest 'trunk' of the JDO TCK.
>>
>> I also also consistently get the following error, but it seems to be a different issue:
>>>> Error copying implementation log file: Source 'C:\Users\ztilmann\Desktop\projects\workspace-jdo\JDO\tck\datanucleus.txt' does not exist
>>
>> Could anyone have a look and tell me what I'm doing wrong? I can also provide if the mistake is not obvious. Code snippets are below.
>>
>> Cheers,
>> Tilmann
>>
>>
>> Code snippet (error occurs in last line in makePersistent):
>>
>>     @Override
>>     protected void localSetUp() {
>>         addTearDownClass(OptionalSample.class);
>>         insertOptionalSample(getPM());
>>     }
>>
>>     private void insertOptionalSample(PersistenceManager pm) {
>>         Transaction tx = pm.currentTransaction();
>>         try {
>>             tx.begin();
>>
>>             //create a dummy object as target
>>             OptionalSample dummyPC = new OptionalSample();
>>             dummyPC.setId(DUMMY_ID);
>>             pm.makePersistent(dummyPC);
>>             ...
>>         }
>>     }
>>
>>
>>
>> Here are the schemas:
>>
>> public class OptionalSample {
>>     long id;
>>
>>     Optional<OptionalSample> optionalPC;
>>     Optional<?> optionalAny;
>>     @SuppressWarnings("rawtypes")
>>     Optional optionalNoGenerics;
>>     Object any;
>>
>>     Optional<Date> optionalDate;
>>     Optional<Integer> optionalInteger;
>>     Optional<String> optionalString;
>>
>>     ...
>> }
>>
>>
>> package.jdo
>> ==========
>>
>>     <class name="OptionalSample" identity-type="application">
>>       <field name="id" primary-key="true"/>
>>       <field name="optionalPC"
>> field-type="org.apache.jdo.tck.pc.query.OptionalSample"
>>                        persistence-modifier="persistent"/>
>>       <field name="optionalDate" persistence-modifier="persistent"/>
>>       <field name="optionalInteger" persistence-modifier="persistent"/>
>>       <field name="optionalString" persistence-modifier="persistent"/>
>>       <field name="optionalAny" persistence-modifier="persistent" embedded="false"
>> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>>       </field>
>>       <field name="optionalNoGenerics" persistence-modifier="persistent" embedded="false"
>> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>>       </field>
>>       <field name="any" persistence-modifier="persistent" embedded="false"
>> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>>       </field>
>>     </class>
>>
>>
>> package-standard.orm:
>> =====================
>>
>>    <class name="OptionalSample" table="OptionalSample">
>>       <field name="id" column="ID"/>
>>       <field name="optionalPC">
>>         <column name="OPTIONAL_PC"/>
>>         <foreign-key/>
>>       </field>
>>       <field name="optionalDate">
>>         <column name="OPTIONAL_DATE"/>
>>       </field>
>>       <field name="optionalInteger">
>>         <column name="OPTIONAL_INTEGER"/>
>>       </field>
>>       <field name="optionalString">
>>         <column name="OPTIONAL_STRING"/>
>>       </field>
>>       <field name="optionalAny" column="OPTIONAL_ANY">
>>         <foreign-key/>
>>       </field>
>>       <field name="optionalNoGenerics" column="OPTIONAL_NO_GENERICS">
>>         <foreign-key/>
>>       </field>
>>       <field name="any" column="OBJECT_ANY">
>>         <foreign-key/>
>>       </field>
>>     </class>
>>
>>
>> schema.sql
>> ==========
>>
>> CREATE TABLE OptionalSample (
>>     ID INTEGER NOT NULL,
>>     OPTIONAL_PC INTEGER REFERENCES SIMPLE_CLASS,
>>     OPTIONAL_DATE DATE,
>>     OPTIONAL_LONG BIGINT,
>>     OPTIONAL_STRING VARCHAR(255),
>>     OPTIONAL_ANY INTEGER REFERENCES SIMPLE_CLASS,
>>     OPTIONAL_NO_GENERICS INTEGER REFERENCES SIMPLE_CLASS,
>>     OBJECT_ANY INTEGER REFERENCES SIMPLE_CLASS,
>>     CONSTRAINT OPTIONALSAMPLE_PK PRIMARY KEY (ID)
>> );
>>
>>
>> Full exception:
>> =============
>>
>> 1) testParameterOptionalWithEmptyFields(org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods)javax.jdo.JDOFatalInternalException: Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception : Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>> java.lang.ClassCastException: org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>>     at org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
>>     at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
>>     at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.prepareDatastoreMapping(ReferenceMapping.java:229)
>>     at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.initialize(ReferenceMapping.java:104)
>>     at org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
>>     at org.datanucleus.store.rdbms.mapping.java.SingleCollectionMapping.initialize(SingleCollectionMapping.java:57)
>>     at org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
>>     at org.datanucleus.store.rdbms.table.ClassTable.manageMembers(ClassTable.java:529)
>>     at org.datanucleus.store.rdbms.table.ClassTable.manageClass(ClassTable.java:435)
>>     at org.datanucleus.store.rdbms.table.ClassTable.initializeForClass(ClassTable.java:1205)
>>     at org.datanucleus.store.rdbms.table.ClassTable.initialize(ClassTable.java:275)
>>     at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.initializeClassTables(RDBMSStoreManager.java:3298)
>>     at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2907)
>>     at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:118)
>>     at org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1644)
>>     at org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:676)
>>     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:3367)
>>     at org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3343)
>>     at org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2079)
>>     at org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1922)
>>     at org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1777)
>>     at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:703)
>>     at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:729)
>>     at org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.insertOptionalSample(SupportedOptionalMethods.java:498)
>>     at org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.localSetUp(SupportedOptionalMethods.java:486)
>>     at org.apache.jdo.tck.JDO_Test.setUp(JDO_Test.java:267)
>>     at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:283)
>>     at org.apache.jdo.tck.util.BatchTestRunner.doRun(BatchTestRunner.java:108)
>>     at org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:148)
>>     at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:123)
>>
>>
>>
>>
>>
>>
>>
> Craig L Russell
> Architect
> craig.russell@oracle.com
> P.S. A good JDO? O, Gasp!
>
>
>
>
>


Re: EmbeddedPCMapping cannot be cast to PersistableMapping

Posted by Craig Russell <cr...@oracle.com>.
Hi Tilmann,

> On May 30, 2016, at 6:10 AM, Tilmann Zäschke <za...@gmx.de> wrote:
> 
> Dear all,
> 
> I'm trying to implement the schema for the new Optional test, but I keep running into a ClassCastException:
> 
> javax.jdo.JDOFatalInternalException: Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception : Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
> java.lang.ClassCastException: org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>    at org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
>    at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
>    ....
> 
> I'm not mentioning 'embedded' anywhere, so I'm not sure where this assumption of 'embedding' comes from.

I think that Optional itself is treated as embedded. I’d investigate which field is causing the problem by trying, one at a time, Optional<?>, Optional<OptionalSample>, etc. and see whether any of these is ok. 

But is Optional even claimed to be supported by datanucleus? I haven’t seen any mail on the subject…

Craig


> I do have Fields of type 'Object', but other tests also don't seem to require embedded=false or similar to handle field of type Object that reference PCs.
> 
> I'm also not even sure (or how I can find out) which of my mapping files are wrong. The error is the same for application-identity and datastore-identity. It occurs wile calling makePersistent().
> I'm using the latest 'trunk' of the JDO TCK.
> 
> I also also consistently get the following error, but it seems to be a different issue:
> >> Error copying implementation log file: Source 'C:\Users\ztilmann\Desktop\projects\workspace-jdo\JDO\tck\datanucleus.txt' does not exist
> 
> 
> Could anyone have a look and tell me what I'm doing wrong? I can also provide if the mistake is not obvious. Code snippets are below.
> 
> Cheers,
> Tilmann
> 
> 
> Code snippet (error occurs in last line in makePersistent):
> 
>    @Override
>    protected void localSetUp() {
>        addTearDownClass(OptionalSample.class);
>        insertOptionalSample(getPM());
>    }
> 
>    private void insertOptionalSample(PersistenceManager pm) {
>        Transaction tx = pm.currentTransaction();
>        try {
>            tx.begin();
> 
>            //create a dummy object as target
>            OptionalSample dummyPC = new OptionalSample();
>            dummyPC.setId(DUMMY_ID);
>            pm.makePersistent(dummyPC);
>            ...
>        }
>    }
> 
> 
> 
> Here are the schemas:
> 
> public class OptionalSample {
>    long id;
> 
>    Optional<OptionalSample> optionalPC;
>    Optional<?> optionalAny;
>    @SuppressWarnings("rawtypes")
>    Optional optionalNoGenerics;
>    Object any;
> 
>    Optional<Date> optionalDate;
>    Optional<Integer> optionalInteger;
>    Optional<String> optionalString;
> 
>    ...
> }
> 
> 
> package.jdo
> ==========
> 
>    <class name="OptionalSample" identity-type="application">
>      <field name="id" primary-key="true"/>
>      <field name="optionalPC"
> field-type="org.apache.jdo.tck.pc.query.OptionalSample"
>                       persistence-modifier="persistent"/>
>      <field name="optionalDate" persistence-modifier="persistent"/>
>      <field name="optionalInteger" persistence-modifier="persistent"/>
>      <field name="optionalString" persistence-modifier="persistent"/>
>      <field name="optionalAny" persistence-modifier="persistent" embedded="false"
> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>      </field>
>      <field name="optionalNoGenerics" persistence-modifier="persistent" embedded="false"
> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>      </field>
>      <field name="any" persistence-modifier="persistent" embedded="false"
> field-type="org.apache.jdo.tck.pc.query.OptionalSample">
>      </field>
>    </class>
> 
> 
> package-standard.orm:
> =====================
> 
>   <class name="OptionalSample" table="OptionalSample">
>      <field name="id" column="ID"/>
>      <field name="optionalPC">
>        <column name="OPTIONAL_PC"/>
>        <foreign-key/>
>      </field>
>      <field name="optionalDate">
>        <column name="OPTIONAL_DATE"/>
>      </field>
>      <field name="optionalInteger">
>        <column name="OPTIONAL_INTEGER"/>
>      </field>
>      <field name="optionalString">
>        <column name="OPTIONAL_STRING"/>
>      </field>
>      <field name="optionalAny" column="OPTIONAL_ANY">
>        <foreign-key/>
>      </field>
>      <field name="optionalNoGenerics" column="OPTIONAL_NO_GENERICS">
>        <foreign-key/>
>      </field>
>      <field name="any" column="OBJECT_ANY">
>        <foreign-key/>
>      </field>
>    </class>
> 
> 
> schema.sql
> ==========
> 
> CREATE TABLE OptionalSample (
>    ID INTEGER NOT NULL,
>    OPTIONAL_PC INTEGER REFERENCES SIMPLE_CLASS,
>    OPTIONAL_DATE DATE,
>    OPTIONAL_LONG BIGINT,
>    OPTIONAL_STRING VARCHAR(255),
>    OPTIONAL_ANY INTEGER REFERENCES SIMPLE_CLASS,
>    OPTIONAL_NO_GENERICS INTEGER REFERENCES SIMPLE_CLASS,
>    OBJECT_ANY INTEGER REFERENCES SIMPLE_CLASS,
>    CONSTRAINT OPTIONALSAMPLE_PK PRIMARY KEY (ID)
> );
> 
> 
> Full exception:
> =============
> 
> 1) testParameterOptionalWithEmptyFields(org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods)javax.jdo.JDOFatalInternalException: Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.OptionalMapping, exception : Failed to generate new Mapping of type org.datanucleus.store.rdbms.mapping.java.ObjectMapping, exception : org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
> java.lang.ClassCastException: org.datanucleus.store.rdbms.mapping.java.EmbeddedPCMapping cannot be cast to org.datanucleus.store.rdbms.mapping.java.PersistableMapping
>    at org.datanucleus.store.rdbms.table.ColumnCreator.createColumnsForField(ColumnCreator.java:253)
>    at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.createPerImplementationColumnsForReferenceField(ReferenceMapping.java:487)
>    at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.prepareDatastoreMapping(ReferenceMapping.java:229)
>    at org.datanucleus.store.rdbms.mapping.java.ReferenceMapping.initialize(ReferenceMapping.java:104)
>    at org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
>    at org.datanucleus.store.rdbms.mapping.java.SingleCollectionMapping.initialize(SingleCollectionMapping.java:57)
>    at org.datanucleus.store.rdbms.mapping.RDBMSMappingManager.getMapping(RDBMSMappingManager.java:482)
>    at org.datanucleus.store.rdbms.table.ClassTable.manageMembers(ClassTable.java:529)
>    at org.datanucleus.store.rdbms.table.ClassTable.manageClass(ClassTable.java:435)
>    at org.datanucleus.store.rdbms.table.ClassTable.initializeForClass(ClassTable.java:1205)
>    at org.datanucleus.store.rdbms.table.ClassTable.initialize(ClassTable.java:275)
>    at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.initializeClassTables(RDBMSStoreManager.java:3298)
>    at org.datanucleus.store.rdbms.RDBMSStoreManager$ClassAdder.run(RDBMSStoreManager.java:2907)
>    at org.datanucleus.store.rdbms.AbstractSchemaTransaction.execute(AbstractSchemaTransaction.java:118)
>    at org.datanucleus.store.rdbms.RDBMSStoreManager.manageClasses(RDBMSStoreManager.java:1644)
>    at org.datanucleus.store.rdbms.RDBMSStoreManager.getDatastoreClass(RDBMSStoreManager.java:676)
>    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:3367)
>    at org.datanucleus.state.StateManagerImpl.makePersistent(StateManagerImpl.java:3343)
>    at org.datanucleus.ExecutionContextImpl.persistObjectInternal(ExecutionContextImpl.java:2079)
>    at org.datanucleus.ExecutionContextImpl.persistObjectWork(ExecutionContextImpl.java:1922)
>    at org.datanucleus.ExecutionContextImpl.persistObject(ExecutionContextImpl.java:1777)
>    at org.datanucleus.api.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:703)
>    at org.datanucleus.api.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:729)
>    at org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.insertOptionalSample(SupportedOptionalMethods.java:498)
>    at org.apache.jdo.tck.query.jdoql.methods.SupportedOptionalMethods.localSetUp(SupportedOptionalMethods.java:486)
>    at org.apache.jdo.tck.JDO_Test.setUp(JDO_Test.java:267)
>    at org.apache.jdo.tck.JDO_Test.runBare(JDO_Test.java:283)
>    at org.apache.jdo.tck.util.BatchTestRunner.doRun(BatchTestRunner.java:108)
>    at org.apache.jdo.tck.util.BatchTestRunner.start(BatchTestRunner.java:148)
>    at org.apache.jdo.tck.util.BatchTestRunner.main(BatchTestRunner.java:123)
> 
> 
> 
> 
> 
> 
> 

Craig L Russell
Architect
craig.russell@oracle.com
P.S. A good JDO? O, Gasp!