App Engine ORM不支持多个父密钥提供程序字段

时间:2010-09-27 03:23:43

标签: google-app-engine orm jpa

我在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 个答案:

答案 0 :(得分:3)

以防万一,请查看Issue 1276(无效)。引用Max Ross:

  

如异常所述,在App Engine上,实体不能有多个父项。这个   是因为OneToMany与数据存储区中的祖先概念联系在一起。每   实体只能有一个直接的祖先。

你真的展示了所有的代码吗?

答案 1 :(得分:0)

//学生实体课程 @实体 @table(名称= “学生”) 公共班学生{

    @Id
    @Column(name="userid")

private String 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")

私人字符串名称;

    @Basic
    @Column(name="school")

私人弦乐学校;

//电话实体类 @实体 @table(名称= “电话”) 公共类电话{

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

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

私人学生;

    @Basic
    @Column(name="number")

private int number;

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

私人课程代码;

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

私人部分;