简体   繁体   English

使用Java中的AppEngine和EntityManager将记录存储到Google DataStore中时出错

[英]Error when storing record into Google DataStore using AppEngine and EntityManager in Java

I am trying to create a webservice that allows a user to add new records into the DataStore and also showing a table filled with the results. 我正在尝试创建一个Web服务,该服务允许用户将新记录添加到DataStore中,并显示一个填充有结果的表。 When the submit button is pressed, the following error appears on the web browser:- 当按下提交按钮时,Web浏览器上出现以下错误:-

javax.persistence.PersistenceException: Invalid primary key for com.epware.gae.java.books.model.Book.  Cannot have a null primary key field if the field is unencoded and of type String.  Please provide a value or, if you want the datastore to generate an id on your behalf, change the type of the field to Long.
at org.datanucleus.api.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:302)
at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:197)
at com.epware.gae.java.books.dao.Dao.add(Dao.java:27)
at com.democo.gae.java.books.ServletCreateTodo.doPost(ServletCreateTodo.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
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:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
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.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:491)
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:212)
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.NucleusFatalUserException: Invalid primary key for com.epware.gae.java.books.model.Book.  Cannot have a null primary key field if the field is unencoded and of type String.  Please provide a value or, if you want the datastore to generate an id on your behalf, change the type of the field to Long.
at com.google.appengine.datanucleus.StoreFieldManager.storeStringPKField(StoreFieldManager.java:599)
at com.google.appengine.datanucleus.StoreFieldManager.storeStringField(StoreFieldManager.java:158)
at org.datanucleus.state.AbstractStateManager.providedStringField(AbstractStateManager.java:1433)
at com.epware.gae.java.books.model.Book.jdoProvideField(Book.java)
at com.epware.gae.java.books.model.Book.jdoProvideFields(Book.java)
at org.datanucleus.state.AbstractStateManager.provideFields(AbstractStateManager.java:1515)
at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObjectsInternal(DatastorePersistenceHandler.java:241)
at com.google.appengine.datanucleus.DatastorePersistenceHandler.insertObject(DatastorePersistenceHandler.java:218)
at org.datanucleus.state.JDOStateManager.internalMakePersistent(JDOStateManager.java:2381)
at org.datanucleus.state.JDOStateManager.flush(JDOStateManager.java:3778)
at org.datanucleus.ObjectManagerImpl.flushInternalWithOrdering(ObjectManagerImpl.java:3888)
at org.datanucleus.ObjectManagerImpl.flushInternal(ObjectManagerImpl.java:3811)
at org.datanucleus.ObjectManagerImpl.flush(ObjectManagerImpl.java:3751)
at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:4141)
at org.datanucleus.ObjectManagerImpl.transactionPreCommit(ObjectManagerImpl.java:428)
at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:398)
at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:287)
at org.datanucleus.ObjectManagerImpl.close(ObjectManagerImpl.java:1090)
at org.datanucleus.api.jpa.JPAEntityManager.close(JPAEntityManager.java:193)
... 39 more

Currently, this is how the object is made:- 当前,这是对象的制造方式:-

public class Book 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String author;
    private String description;
    private String publisher;
    private String publishDate;

    public Book(String title, String authorFirst, String authorSecond, String description, String publisher, String publishDate) {
        this.title = title;
        this.author = authorFirst+" "+authorSecond;
        this.description = description;
        this.publisher = publisher;
        this.publishDate = publishDate;
    }

    //Setters and Getters Below
}

How can I fix it so that the data can be entered into the table? 如何修复它,以便可以将数据输入表中? I don't fully understand what the error message is saying but i'm fairly sure its to do with how the object itself is being made. 我不完全理解错误消息在说什么,但我相当确定这与对象本身的制造方式有关。 Any help on how to resolve this is much appreciated. 非常感谢您提供有关如何解决此问题的帮助。

entities must have a default constractor. 实体必须具有默认承包商。

so in order to solve this you need to add this to you're code: 因此,为了解决此问题,您需要将其添加到您的代码中:

public Book()
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用Java将Unicode字符串保存到数据存储区Google Appengine - How to save unicode string into datastore google appengine using java 在REST中使用Google Appengine datastore.key时出错 - Error using google appengine datastore.key with REST 如何使用Java确定Google AppEngine数据存储区中给定键的对象是否存在? - How to I determine if an object exists for a given key in the Google AppEngine datastore using Java? 使用com.google.appengine.api.datastore.Text时如何维护格式和缩进 - How to maintain formatting and indentation when using com.google.appengine.api.datastore.Text java.lang.NoClassDefFoundError: com/google/appengine/api/datastore/AsyncDatastoreService - java.lang.NoClassDefFoundError: com/google/appengine/api/datastore/AsyncDatastoreService Java Google Appengine datastore.get在现有实体上引发EntityNotFoundException - Java Google appengine datastore.get throws EntityNotFoundException on an existing entity 示例应用中的com.google.appengine.api.datastore.DatastoreNeedIndexException错误 - com.google.appengine.api.datastore.DatastoreNeedIndexException error in Sample App 如何知道Google AppEngine HRD数据存储区的更新何时完成? - How to know when updates to the Google AppEngine HRD datastore are complete? 在Google AppEngine数据存储中使用500多个字符字符串 - Using 500+ Char Strings with Google AppEngine Datastore 使用 EntityManager 获取 sql 记录时出错 - Error while getting sql record using EntityManager
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM