App Engine ORM не поддерживает несколько полей поставщика родительского ключа - PullRequest
1 голос
/ 27 сентября 2010

У меня проблема с отображением родительских / дочерних отношений в JPA, и в настоящее время отсутствует сообщение об ошибке:

java.lang.IllegalArgumentException: org.datanucleus.exceptions.NucleusException: App Engine ORM does not support multiple parent key provider fields.
 at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:232)
 at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.find(DatastoreEntityManager.java:56)
 at bios.model.DAO.StudentDAO.retrieveStudent(StudentDAO.java:31)
 at bios.model.manager.StudentMgr.authenticateStudent(StudentMgr.java:27)
 at bios.controller.AuthenticateServlet.doPost(AuthenticateServlet.java:99)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
 at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
 at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
 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:765)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
 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:938)
 at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
 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:409)
 at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: org.datanucleus.exceptions.NucleusException: App Engine ORM does not support multiple parent key provider fields.
 at org.datanucleus.store.appengine.DatastoreTable.markFieldAsParentKeyProvider(DatastoreTable.java:477)
 at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK(DatastoreTable.java:399)
 at org.datanucleus.store.appengine.DatastoreTable.buildMapping(DatastoreTable.java:288)
 at org.datanucleus.store.appengine.DatastoreManager.buildStoreData(DatastoreManager.java:479)
 at org.datanucleus.store.appengine.DatastoreManager.newStoreData(DatastoreManager.java:437)
 at org.datanucleus.store.AbstractStoreManager.addClasses(AbstractStoreManager.java:788)
 at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:759)
 at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:358)
 at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass(DatastoreManager.java:709)
 at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass(DatastoreManager.java:87)
 at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK(DatastoreTable.java:393)
 at org.datanucleus.store.appengine.DatastoreTable.buildMapping(DatastoreTable.java:288)
 at org.datanucleus.store.appengine.DatastoreManager.buildStoreData(DatastoreManager.java:479)
 at org.datanucleus.store.appengine.DatastoreManager.newStoreData(DatastoreManager.java:437)
 at org.datanucleus.store.AbstractStoreManager.addClasses(AbstractStoreManager.java:788)
 at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:759)
 at org.datanucleus.store.mapped.MappedStoreManager.getDatastoreClass(MappedStoreManager.java:358)
 at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass(DatastoreManager.java:709)
 at org.datanucleus.store.appengine.DatastoreManager.getDatastoreClass(DatastoreManager.java:87)
 at org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.prepareDatastoreMapping(PersistenceCapableMapping.java:198)
 at org.datanucleus.store.mapped.mapping.PersistenceCapableMapping.initialize(PersistenceCapableMapping.java:117)
 at org.datanucleus.store.mapped.mapping.MappingFactory.createMapping(MappingFactory.java:97)
 at org.datanucleus.store.mapped.mapping.AbstractMappingManager.getMapping(AbstractMappingManager.java:248)
 at org.datanucleus.store.appengine.DatastoreTable.initializeNonPK(DatastoreTable.java:322)
 at org.datanucleus.store.appengine.DatastoreTable.buildMapping(DatastoreTable.java:288)
 at org.datanucleus.store.appengine.DatastoreManager.buildStoreData(DatastoreManager.java:479)
 at org.datanucleus.store.appengine.DatastoreManager.newStoreData(DatastoreManager.java:437)
 at org.datanucleus.store.AbstractStoreManager.addClasses(AbstractStoreManager.java:788)
 at org.datanucleus.store.AbstractStoreManager.addClass(AbstractStoreManager.java:759)
 at org.datanucleus.ObjectManagerImpl.newObjectId(ObjectManagerImpl.java:2508)
 at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:228)
 ... 31 more

Вот мой код для ученика

@Entity
@Table(name="STUDENT")
public class Student {

    @Id
    @Column(name="userid")
    private String userid;

    @OneToMany(mappedBy = "student", targetEntity = Phone.class,
        fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Phone> phoneList = new ArrayList<Phone>();

А вот и мой класс телефона.

@Entity
@Table(name="PHONE")
public class Phone {
    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="userid")
    private Student student;

Пожалуйста, помогите! Спасибо! :)

Ответы [ 2 ]

3 голосов
/ 27 сентября 2010

На всякий случай взгляните на Выпуск 1276 (что недопустимо). Цитата Макса Росса:

Как указывает исключение, в App Engine у ​​сущности не может быть нескольких родителей. это потому что OneToMany привязан к понятию предка в хранилище данных. каждый сущность может иметь только одного прямого предка.

Вы действительно показываете весь код?

0 голосов
/ 27 сентября 2010

// Класс сущности ученика @Entity @Table (name = "STUDENT") общедоступный класс Студент {

    @Id
    @Column(name="userid")

идентификатор пользователя частной строки;

    @OneToMany(mappedBy = "student",
    targetEntity = Bid.class,
    fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Phone> phoneList = new ArrayList<Phone>();

    @Basic
    @Column(name="password")

пароль частной строки;

    @Basic
    @Column(name="name")

личное имя String;

    @Basic
    @Column(name="school")

личное String school;

// Телефонный класс сущности @Entity @Table (name = "Phone") открытый класс Phone{

    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="userid")

частный студент;

    @Basic
    @Column(name="number")

частный номер инт;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="code")

частный код курса;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="section")

частныйСекция секция;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...