我在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;
请帮忙!谢谢! :)
答案 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")
私人部分;