0
votes

I was unable to read the full inherited class instances as described in following URL

http://www.datanucleus.org/products/datanucleus/jdo/orm/inheritance.html

Following describes the mapping of classes.

@PersistenceCapable(detachable = "true")
@Discriminator(strategy=DiscriminatorStrategy.CLASS_NAME)
@Inheritance(strategy=InheritanceStrategy.NEW_TABLE)
public class IdeaItem {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Column(jdbcType = "INTEGER", length = 11)
    private long id;

    @Column(name="IDEAID")
    private Idea idea;

    @Column(jdbcType = "INTEGER", length = 11)
    private long showOrder;

 }

 @PersistenceCapable(detachable = "true") 
 @Inheritance(strategy=InheritanceStrategy.NEW_TABLE)
 public class IdeaItemText extends IdeaItem {

    @Column(jdbcType = "VARCHAR", length = 500) 
    private String text;

 }

Data saving part working fine. I inserted "IdeaItemText" object and both "IdeaItem" and "IdeaItemText" tables got updated successfully.

Now I need to read Subclasses by putting "IdeaItem" as an Extent. I executed the following code.

 Extent items = getPersistenceManager().getExtent(IdeaItem.class,true);
 javax.jdo.Query q = getPersistenceManager().newQuery(items);
 List data = (List)q.execute();

As in the JDO docs, this should return the whole object graph. But this is not returning any record. When I check the log, I found that it searching for a reacord where Discriminator Value equals to "com.mydomain.IdeaItem" which does not exists. When I removed the Discriminator annotation I got all the records in the table. Even though how I access the sub classes attributes ? Furthermore how I query subclass attributes with the base class Extent ?

1

1 Answers

0
votes

So you didn't let the persistence mechanism know about the subclass (whether that is using auto-start mechanism, persistence.xml, calling pm.getExtent on the subclass, or simply instantiating the subclass.class). It can only query classes that it is "aware of"