Java DataNucleus类不可持久异常

Java DataNucleus类不可持久异常,java,netbeans,jdo,datanucleus,Java,Netbeans,Jdo,Datanucleus,我试图用DataNucleusJDO(以及neodatis作为数据存储)创建一些基本的持久类 我有以下三门课(从教程中复制) inventory.java @PersistenceCapable public class Inventory { @PrimaryKey String name = null; Set<Product> products = new HashSet(); public Inventory(String name) { this.name =

我试图用DataNucleusJDO(以及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;}
}
和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.
我想不出为什么,有人能给我一个提示吗?

试试看:

@Entity // use this annotation 
public class MyClass
{
@Id
long id;

@Basic
@Convert(converter=URLStringConverter.class)
URL url;
试试看:

@Entity // use this annotation 
public class MyClass
{
@Id
long id;

@Basic
@Convert(converter=URLStringConverter.class)
URL url;

几年后,同样的症状出现了。在我的例子中,我在堆栈跟踪上得到了相同的错误和3条建议。然而,对我来说,实际的问题并不是这些,而是我在Eclipse和Google上运行的应用程序引擎设置没有同时选中“启用本地HRD支持”和“用户DataNucleus JDO/JPA访问数据存储”。一旦我检查了这些项目,我就能够像以前一样使用相同的代码持久化,并且没有出现上述错误。

几年后,同样的症状出现了。在我的例子中,我在堆栈跟踪上得到了相同的错误和3条建议。然而,对我来说,实际的问题并不是这些,而是我在Eclipse和Google上运行的应用程序引擎设置没有同时选中“启用本地HRD支持”和“用户DataNucleus JDO/JPA访问数据存储”。一旦我检查了这些项目,我就能够使用与以前相同的代码持久化,并且没有出现上述错误。

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

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

hmm“实体”似乎更像JPA风格。。。但是它根本不起作用。datanucleus.org/products/accessplatform/JPA/annotations.html我使用的是JDOAPI,而不是JPA…嗯,“实体”看起来更像JPA风格。。。但是它根本不起作用。datanucleus.org/products/accessplatform/JPA/annotations.html我使用的是JDO api,而不是JPA…消息列出了3个可能的原因,请检查这3件事。@datanucleus我不是那么笨,当然我已经检查了这3件事,特别是1件。该类还没有被加密:enhangher日志中另有说明2。enhanched类是隐藏的:jar中只有一个版本的类,它是enhanched类(enhancher编写的版本)。3.找不到注释:只需查看源文件,注释就在它们应该位于的位置。但它给了我那个错误…谁说“愚蠢”?我建议你看看这三件事,因为这三件事是最常见的。增强器增强类是的,但是增强的类在运行时是否在类路径中?字节码反编译器将确认该类是否得到了增强,在相关类上运行“javap”也是如此。您还可以很容易地打印出该异常的堆栈跟踪。这给出了错误来源的源点,以及类被认为不可持久的原因;你还没有提供。DataNucleus教程(可免费下载)为Ant和Maven提供了同样有效的构建文件,如果有问题,你可以很容易地从这些文件开始,找出问题出在哪里。事实上,我在这里跳了枪,对不起。然而,我在Inventory类上运行了javap:从“Inventory.java”公共类minchiabbasta.Inventory{java.lang.String name;java.util.Set products;public minchiabbasta.Inventory(java.lang.String);public java.util.Set getProducts();}编译而来,似乎只有普通类。。。奇怪的是,因为这正是enhancher编写的文件…消息列出了3个可能的原因,所以请检查这3件事。@DataNucleus我不是那么笨,当然我已经检查了这3件事,特别是1。该类还没有被加密:enhangher日志中另有说明2。enhanched类是隐藏的:jar中只有一个版本的类,它是enhanched类(enhancher编写的版本)。3.找不到注释:只需查看源文件,注释就在它们应该位于的位置。但它给了我那个错误…谁说“愚蠢”?我建议你看看这三件事,因为这三件事是最常见的。增强器增强类是的,但是增强的类在运行时是否在类路径中?字节码反编译器将确认该类是否得到了增强,在相关类上运行“javap”也是如此。您还可以很容易地打印出该异常的堆栈跟踪。这给出了错误来源的源点,以及类被认为不可持久的原因;你还没有提供。DataNucleus教程(可免费下载)为Ant和Maven提供了同样有效的构建文件,如果有问题,你可以很容易地从这些文件开始,找出问题出在哪里。事实上,我在这里跳了枪,对不起。然而,我在Inventory类上运行了javap:从“Inventory.java”公共类minchiabbasta.Inventory{java.lang.String name;java.util.Set products;public minchiabbasta.Inventory(java.lang.String);public java.util.Set getProducts();}编译而来,似乎只有普通类。。。奇怪,因为这正是enhancher写的文件。。。