【问题标题】:Google App Engine ClassNotPersistenceCapableExceptionGoogle App Engine ClassNotPersistenceCapableException
【发布时间】:2011-02-11 16:39:49
【问题描述】:

我有以下课程:

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.*;

@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class PayPal_Message
{
  @PrimaryKey
  @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
  private Long id;
  @Persistent
  private Text content;
  @Persistent
  private String time;

  public PayPal_Message(Text content,String time)
  {
    this.content=content;
    this.time=time;
  }

  public Long getId() { return id; }
  public Text getContent() { return content; }
  public String getTime() { return time; }
  public void setContent(Text content) { this.content=content; }
  public void setTime(String time) { this.time=time; }
}

它曾经在一个包中,并且工作正常,现在我将所有类都放在默认包中,这导致了这个错误:

org.datanucleus.jdo.exceptions.ClassNotPersistenceCapableException: The class "The class "PayPal_Message" is not persistable. 这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或者是被未增强的版本隐藏),或者找不到该类的元数据/注释。”是不可持久的。这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或者被未增强的版本隐藏),或者找不到该类的元数据。 嵌套的Throwables: org.datanucleus.exceptions.ClassNotPersistableException:“PayPal_Message”类不可持久。这意味着它要么没有被增强,要么文件的增强版本不在 CLASSPATH 中(或者被未增强的版本隐藏),或者找不到该类的元数据/注释。

我应该怎么做才能解决它?

【问题讨论】:

  • 为什么要把它放在默认包中?出于某种原因使用包是最佳实践

标签: java google-app-engine persistence


【解决方案1】:

我有时会莫名其妙地遇到这些异常。

在持久类中的某处添加一个空间并重建在过去为我修复了它。不知道为什么会发生,也不知道为什么重建会修复它,但至少值得一试。

【讨论】:

    【解决方案2】:

    我最终将它们放回了包装中,现在可以正常使用了。

    【讨论】:

      【解决方案3】:

      说明:默认包中的类对包内的类不可见/不可导入。

      试试下面的例子:

      public class Entity {}
      

      (因此没有包装!)和

      package persistence;
      
      public class EntityManager {
          public static void main(String... args) {
              Entity entity = new Entity();
          }
      }
      

      有效吗?不?您将如何导入它?这就是幕后发生的问题!

      【讨论】:

      • 但是我把“ALL”类放在那个项目的默认包里,为什么不能工作?
      • 因为您使用的持久性 API(在本例中为 Datanucleus)未使用默认包。这不是上面的代码,而是“幕后”发生的事情。您无法从其他包访问默认包中的类。
      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 2011-10-25
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2019-05-17
      相关资源
      最近更新 更多