【问题标题】:DataNucleus Class not Persistable ExceptionDataNucleus 类不可持久异常
【发布时间】:2013-01-30 23:29:03
【问题描述】:

我试图用 datanucleus jdo(和 neodatis 作为数据存储)制作一些基本的持久类。

我有以下三个课程(从教程中复制)

inventory.java

@PersistenceCapable
public class Inventory {

@PrimaryKey
String name = null;

Set<Product> products = new HashSet();

public Inventory(String name)
{
    this.name = name;}

public Set<Product> getProducts() {return products;}
}

产品.java

@PersistenceCapable
public class Product {

@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
long id;
String name = null;
String description = null;
double price = 0.0;

public Product(String name, String desc, double price)
    {
    this.name = name;
    this.description = desc;
    this.price = price;}

}

和 book.java

@PersistenceCapable
public class Book extends Product {

String author=null;
String isbn=null;
String publisher=null;

public Book(String name, String desc, double price, String author, 
            String isbn, String publisher)
{
    super(name,desc,price);
    this.author = author;
    this.isbn = isbn;
    this.publisher = publisher;
}    
}

自从我在构建项目时得到这个:

(...)
gen 31, 2013 12:10:14 AM org.datanucleus.enhancer.DataNucleusEnhancer main
INFO: DataNucleus Enhancer (version 3.2.0.m2) for API "JDO" using JRE "1.7"
ENHANCED (PersistenceCapable) : minchiabbasta.Book
ENHANCED (PersistenceCapable) : minchiabbasta.Inventory
ENHANCED (PersistenceCapable) : minchiabbasta.Product
(...)

但是

在运行应用程序时,持久性管理器会很好地启动,但是当它尝试使某些东西持久化时,会抛出此异常

org.datanucleus.api.jdo.exceptions.ClassNotPersistenceCapableException: The class 
"minchiabbasta.Inventory" is not persistable. This means that it either hasnt been 
enhanced, or that the enhanced version of the file is not in the CLASSPATH (or is 
hidden by an unenhanced version), or the Meta-Data/annotations for the class are not 
found.

我不知道为什么,谁能给我一个提示?

【问题讨论】:

  • 该消息列出了 3 个可能的原因,因此请检查这 3 个事项。
  • @DataNucleus 我不是那么愚蠢的,我当然检查过这三件事,特别是 1. 课程没有得到增强:enhangher log 另有说明 2. the增强的类是隐藏的:jar 中只有一个版本的类,它是增强的一个(增强器写的那个)。 3. 没有找到注解:只看源文件,注解在他们应该在的地方。然而它给了我那个错误......
  • 谁提到了“愚蠢”?我建议你看看这三件事,因为这是最常见的三件事。增强器增强了类是的,但是在运行时 CLASSPATH 中的增强类是吗?字节码反编译器将确认该类是否得到增强,就像在相关类上运行“javap”一样。您还可以轻松地打印出该异常的堆栈跟踪。这给出了错误来自的源点,以及为什么认为该类是不可持久的;你还没有提供。
  • (可免费下载的)DataNucleus 教程提供了适用于 Ant 和 Maven 的构建文件,它们也可以工作,如果遇到问题,您可以轻松地从这些文件开始,找出问题所在
  • 实际上没有人,我在那儿开枪了,对不起。但是我在 Inventory 类上运行了 javap: 编译自“Inventory.java” public class minchiabbasta.Inventory { java.lang.String name; java.util.Set 产品;公共 minchiabbasta.Inventory(java.lang.String); public java.util.Set getProducts(); } 并且似乎只有普通类...奇怪,因为它是增强器编写的文件...

标签: java netbeans jdo datanucleus


【解决方案1】:

多年后,同样的症状。就我而言,我在堆栈跟踪上遇到了同样的错误和 3 条建议。然而对我来说,真正的问题不是这些,而是​​我在 Eclipse 和 Google | 上运行的。 App Engine 设置未检查“启用本地 HRD 支持”和“用户数据核 JDO/JPA 以访问数据存储区”。一旦我检查了这些项目,我就能够使用与以前相同的代码进行持久化,并且没有收到上述错误。

【讨论】:

    【解决方案2】:

    如果您的增强器在 Eclipse 中保存文件时运行,请注意查看它是否在 Eclipse 控制台中进行了增强。我注意到我安装的 Eclipse 偶尔会忘记增强类。如果它忘记了,它会将类部署到未增强的 GAE。只需重新启动 Eclipse 即可。

    【讨论】:

      【解决方案3】:

      试试看:

      @Entity // use this annotation 
      public class MyClass
      {
      @Id
      long id;
      
      @Basic
      @Convert(converter=URLStringConverter.class)
      URL url;
      

      【讨论】:

      • 嗯“实体”看起来更像 JPA 风格......但是它根本不起作用。
      • datanucleus.org/products/accessplatform/ JPA /annotations.html 我使用的是 JDO api,而不是 JPA...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 2011-09-15
      • 2017-08-18
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多