surinder-insonix / datanucleus-appengine

Automatically exported from code.google.com/p/datanucleus-appengine
0 stars 0 forks source link

JDO Inheritance and generic declaration error #229

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Declare a super-class as follow

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = 
"false")
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public class Person<T extends Entity> implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
    protected String encodedKey;
    @Persistent
    protected T owner;

and the following subclasses

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = 
"false")
public class Client extends Person implements Serializable {

    @Persistent
    private String name;

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = 
"false")
public class User extends Person<Company> implements Entity {

    @Persistent
    private String firstName;
    @Persistent
    private String lastName;
    @Persistent
    private String login;
    @Persistent
    private transient String password;
    @Persistent(mappedBy = "owner")
    @Element(dependent = "true")
    private transient List<Client> clients = new ArrayList<Client>();

try to make a user persistent

declare this another class and try to make it persistent

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = 
"false")
public class Company implements Entity, Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;
    @Persistent
    private String name;
    @Persistent
    private Date dischargeDate;
    @Persistent
    private Date lowDate;
    @Persistent(mappedBy = "owner")
    @Element(dependent = "true")
    private transient List<User> users = new ArrayList<User>();
    @Persistent(mappedBy = "owner")
    @Element(dependent = "true")
    private transient List<Client> clients = new ArrayList<Client>();

what I got is no errors neither log output for the User class, but when I tried 
to persist a Company, I got the following error

javax.jdo.JDOUserException: La clase 
"co.com.ias.sitex.shared.domain.model.Company" tiene campo de collecci�n 
"clients" pero este no tiene un Mapping en la tabla de la clase de elementos 
"co.com.ias.sitex.shared.domain.model.Client" campo "owner"
     [java]         at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:375)
     [java]         at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:674)
     [java]         at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)
     [java]         at co.com.ias.sitex.server.config.IgnitionServlet.processRequest(IgnitionServlet.java:79)
     [java]         at co.com.ias.sitex.server.config.IgnitionServlet.doGet(IgnitionServlet.java:100)
     [java]         at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
     [java]         at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
     [java]         at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
     [java]         at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
     [java]         at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
     [java]         at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
     [java]         at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
     [java]         at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
     [java]         at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
     [java]         at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     [java]         at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
     [java]         at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     [java]         at org.mortbay.jetty.Server.handle(Server.java:326)
     [java]         at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
     [java]         at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
     [java]         at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
     [java]         at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
     [java]         at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
     [java]         at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
     [java]         at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
     [java] NestedThrowablesStackTrace:
     [java] La clase "co.com.ias.sitex.shared.domain.model.Company" tiene campo de collecci�n "clients" pero este no tiene un Mapping en la tabla de la clase de elementos "co.com.ias.sitex.shared.domain.model.Client" campo "owner"
     [java] org.datanucleus.exceptions.NucleusUserException: La clase "co.com.ias.sitex.shared.domain.model.Company" tiene campo de collecci�n "clients" pero este no tiene un Mapping en la tabla de la clase de elementos "co.com.ias.sitex.shared.domain.model.Client" campo "owner"
     [java]         at org.datanucleus.store.mapped.scostore.FKListStore.<init>(FKListStore.java:162)
     [java]         at org.datanucleus.store.appengine.DatastoreFKListStore.<init>(DatastoreFKListStore.java:41)
     [java]         at org.datanucleus.store.appengine.DatastoreManager.newFKListStore(DatastoreManager.java:528)
     [java]         at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForCollection(MappedStoreManager.java:729)
     [java]         at org.datanucleus.store.mapped.MappedStoreManager.getBackingStoreForField(MappedStoreManager.java:646)
     [java]         at org.datanucleus.sco.backed.List.<init>(List.java:104)
     [java]         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
     [java]         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
     [java]         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
     [java]         at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
     [java]         at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance_(Runtime.java:112)
     [java]         at com.google.appengine.tools.development.agent.runtime.Runtime.newInstance(Runtime.java:120)
     [java]         at org.datanucleus.util.ClassUtils.newInstance(ClassUtils.java:94)
     [java]         at org.datanucleus.sco.SCOUtils.newSCOInstance(SCOUtils.java:164)
     [java]         at org.datanucleus.store.mapped.mapping.AbstractContainerMapping.replaceFieldWithWrapper(AbstractContainerMapping.java:426)
     [java]         at org.datanucleus.store.mapped.mapping.CollectionMapping.postInsert(CollectionMapping.java:165)
     [java]         at org.datanucleus.store.appengine.DatastoreRelationFieldManager.runPostInsertMappingCallbacks(DatastoreRelationFieldManager.java:217)
     [java]         at org.datanucleus.store.appengine.DatastoreRelationFieldManager.access$200(DatastoreRelationFieldManager.java:48)
     [java]         at org.datanucleus.store.appengine.DatastoreRelationFieldManager$1.apply(DatastoreRelationFieldManager.java:116)
     [java]         at org.datanucleus.store.appengine.DatastoreRelationFieldManager.storeRelations(DatastoreRelationFieldManager.java:81)
     [java]         at org.datanucleus.store.appengine.DatastoreFieldManager.storeRelations(DatastoreFieldManager.java:955)
     [java]         at org.datanucleus.store.appengine.DatastorePersistenceHandler.storeRelations(DatastorePersistenceHandler.java:546)
     [java]         at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertPostProcess(DatastorePersistenceHandler.java:304)
     [java]         at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObjects(DatastorePersistenceHandler.java:256)
     [java]         at org.datanucleus.store.appengine.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:240)
     [java]         at org.datanucleus.state.JDOStateManagerImpl.internalMakePersistent(JDOStateManagerImpl.java:3185)
     [java]         at org.datanucleus.state.JDOStateManagerImpl.makePersistent(JDOStateManagerImpl.java:3161)
     [java]         at org.datanucleus.ObjectManagerImpl.persistObjectInternal(ObjectManagerImpl.java:1298)
     [java]         at org.datanucleus.ObjectManagerImpl.persistObject(ObjectManagerImpl.java:1175)
     [java]         at org.datanucleus.jdo.JDOPersistenceManager.jdoMakePersistent(JDOPersistenceManager.java:669)
     [java]         at org.datanucleus.jdo.JDOPersistenceManager.makePersistent(JDOPersistenceManager.java:694)
     [java]         at co.com.ias.sitex.server.config.IgnitionServlet.processRequest(IgnitionServlet.java:79)
     [java]         at co.com.ias.sitex.server.config.IgnitionServlet.doGet(IgnitionServlet.java:100)
     [java]         at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
     [java]         at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
     [java]         at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
     [java]         at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
     [java]         at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
     [java]         at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
     [java]         at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
     [java]         at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
     [java]         at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
     [java]         at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
     [java]         at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
     [java]         at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     [java]         at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
     [java]         at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
     [java]         at org.mortbay.jetty.Server.handle(Server.java:326)
     [java]         at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
     [java]         at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
     [java]         at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
     [java]         at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
     [java]         at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
     [java]         at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
     [java]         at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

I've been trying this on GAE sdk 1.4.2 and 1.4.3 but the result is the same

Original issue reported on code.google.com by bip...@gmail.com on 29 Mar 2011 at 11:13

GoogleCodeExporter commented 8 years ago
Neither JDO nor JPA spec mandate persistence of fields of generic types

Original comment by googleco...@yahoo.co.uk on 25 Jun 2011 at 7:47

GoogleCodeExporter commented 8 years ago

Original comment by googleco...@yahoo.co.uk on 26 Jun 2011 at 5:58