JPA – 未知的实体bean类

希望我能正确解释这个问题。 我有3个课程来处理我的实体。

@MappedSuperclass public abstract class Swab implements ISwab { ... private Collection accounts; ... } @Entity @Table(name="switches") @DiscriminatorColumn(name="type") @DiscriminatorValue(value="DMS500") public class DmsSwab extends Swab implements ISwab, Serializable { ... private ObjectPool pool; ... @Transient public ObjectPool getPool(){ return pool; } ... } @Entity(name="swab_accounts") public class SwabAccounts implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private int swab_account_id; private int swab_id; ... } 

在EJB中,查询正在以这种方式进行

  DmsSwab dms = em.find(DmsSwab.class, 2); List s = new ArrayList(1); s.add(dms); 

我的persistence.xml看起来像这样:

    oracle.toplink.essentials.PersistenceProvider com.dcom.sap.dms.DmsSwab com.dcom.sap.jpa.SwabAccounts         

我收到此错误:

 java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. com.dcom.sap.SwabException: java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. Caused by: java.lang.IllegalArgumentException: Unknown entity bean class: class com.dcom.sap.dms.DmsSwab, please verify that this class has been marked with the @Entity annotation. at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.findInternal(EntityManagerImpl.java:306) at oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.find(EntityManagerImpl.java:148) 

我正在使用随附的glassfish版本运行netbeans 6.1。 MySql 5.0。

在persistence.xml中的class标签中定义此实体

根据错误消息和我从您的代码中得到的结果,错误似乎在persistence.xml文件中,您是否可能更冗长?

我有同样的错误,并补充上面的信息,我的情况是一个ClassLoader问题。 我的应用有三个文件。 ejb-module.jar依赖于app-lib.jar(包含pojo和数据库实体的库)和依赖于app-lib.jar的web-module.war。

在部署中,app-lib.jar被glassfish加载了两次。 谷歌搜索,我发现我应该将app-lib.jar复制到glassfish域中的“共享”库。 我已将postgresql.jar复制到“domain-dir / lib”,将app-lib.jar复制到“domain-dir / lib / applibs”。 完成后,该应用程序就像一个魅力。

使用的解释可以在这里找到: http : //docs.oracle.com/cd/E19798-01/821-1752/beade/index.html

我解决了这个问题,在我的Web App中创建了一个ContextListener,在destroy context中调用实体管理器工厂的关闭,:

 public void contextDestroyed(ServletContextEvent servletContextEvent) { try { logger.info("contextDestroyed..."); LifeCycleManager lifeCycleManager = ServiceLocator.getLifeCycleManager(); lifeCycleManager.closeEntityManagerFactory(); } catch (Exception e) { logger.error(e.getMessage(), e); } } 

我还创建了一个名为LifeCycleManager的bean,并在其中调用DAO方法来关闭实体管理器工厂:

 public void closeEntityManagerFactory() throws BusinessException { logger.info("closeEntityManager"); try { logger.info("closing entity manager factory..."); genericDAO.closeEntityManagerFactory(); logger.info("Entity manager factiry closed"); } catch (Exception e) { throw new BusinessException(BusinessErrorCode.CODIGO_EJEMPLO_01, Severity.ERROR); } } 

在DAO里面:

 @Autowired private EntityManagerFactory entityManagerFactory; 

 public void closeEntityManagerFactory() { logger.info("closing entity manager factory"); getEntityManagerFactory().close(); logger.info("entity manager factory closed"); } 

每次我从eclipse环境部署更改时都会使用它来调用destroy上下文。 我希望可以帮助你们,我的环境是WebLogic Server 11gR1和JPA 1.0。