即使实体标有@Entity注释,也会显示未知的实体类错误消息

我正在使用Netbean6.9.1和JPA EclipseLink构建REST Web应用程序。

我面临的问题是即使我的实体类MasatoTable标有Entity注释,我也会收到错误:

(java.lang.IllegalArgumentException: Unknown entity bean class: class entity.MasatoTable, please verify that this class has been marked with the @Entity annotation.) 

问题是当我从NetbeanIDE重新启动GlassFish3服务器时,它会工作一段时间,不知怎的,在某些时候,错误开始出现。 我以前使用Toplink Essential并没有问题,但我已经改为EclipseLink并重新定义persistence.xml(如下所示)并且此问题已经开始。 但我没有看到任何我能想到的代码错误..

MasatoTable.java

 @Entity @Table(name = "MasatoTable") public class MasatoTable implements Serializable { ...continue code... 

persistence.xml中

    org.eclipse.persistence.jpa.PersistenceProvider jdbc/koga_kojo entity.MasatoTable           

看起来像是同一个问题,但该票证的解决方案是从Eclipselink回滚到Toplink。 有没有人解决这个问题而不回滚到toplink?

热部署后的未知实体bean类:netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0

UPDATE

就我的研究而言,就这个案例而言,看起来已经解决并修复了错误?

https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141

我不够了解整个事情,但我找到的事实很少:

Netbean6.9.1提供EclipseLink 2.0.1,而最新版本为2.2.0

我下载了最新版本并将它们放入lib目录然后重新部署但没有运气,问题仍然存在。 不确定我是否以错误的方式做事。

詹姆斯发表评论后更新

下面是我用来创建单例EntityManagerFactory以及如何使用它的类。

 package common; import java.util.Date; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class EmProvider { private static final String DB_PU = "kojoPU"; //工場DB public static final boolean DEBUG = false; private static final EmProvider singleton = new EmProvider(); private EntityManagerFactory emf; private EmProvider() {} public static EmProvider getInstance() { return singleton; } public EntityManagerFactory getEntityManagerFactory() { if(emf == null) { emf = Persistence.createEntityManagerFactory(DB_PU); } if(DEBUG) { System.out.println("factory created on: " + new Date()); } return emf; } public void closeEmf() { if(emf.isOpen() || emf != null) { emf.close(); } emf = null; if(DEBUG) { System.out.println("EMF closed at: " + new Date()); } } }//end class 

如何使用:

 EntityManager em = null; Object out = null; try { em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); Query query = em.createNativeQuery(sql); ....some code here } finally { if(em != null) { em.close(); } } 

通过查看我的代码,我认为…… 我没有关闭EntityManagerFactory (我终于关闭了EntityManager)

我也发现主题中的"unknown entity bean class"错误显示以下操作。

  1. 通过Netbean部署Web应用程序(这将打开浏览器)

  2. 在Netbean IDE中更改一些代码并保存。 然后Netbean将在您按下保存按钮后自动重新部署(这称为“热部署”???)

  3. 返回浏览器并执行一些操作,例如添加涉及EntityManager的一些数据。

看起来发生错误是因为我在热部署时没有关闭实体经理工厂? 我要调查一下。

您是如何创建EntityManager / Factory的,是管理还是非管理?

如果它没有被管理,那么我相信EclipseLink不会以任何方式通知重新部署,因此仍然会将旧的EntityManagerFactory缓存,因为它永远不会被关闭。 您可以确保在热部署后关闭EntityManagerFactory吗?

您可以使持久性单元成为托管持久性单元,这可以解决问题。

无论哪种方式,请在EclipseLink和Glassfish中记录此错误,因为应该跟踪此问题。

我想这可能是错误, https://bugs.eclipse.org/bugs/show_bug.cgi?id = 326552

请为此错误投票,并在其中包含您的信息。

这里的解决方案是使用JPA 1.0,如果不需要2.0。

今天我面临同样的问题,但我在persistence.xml中纠正了

  1. 请检查实体类名称和包是否在persistence.xml中正确定义。