9

我正在使用 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...

持久性.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="kojoPU">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/koga_kojo</non-jta-data-source>
    <class>entity.MasatoTable</class>
    <properties>
      <property name="eclipselink.logging.logger" value="JavaLogger"/>
      <property name="eclipselink.logging.level.sql" value="FINEST"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://KOGADBSERVER;databaseName=MasatoDB"/>
      <property name="javax.persistence.jdbc.password" value="foobar"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.user" value="koga"/>
    </properties>
  </persistence-unit>
</persistence>

看起来像同样的问题,但该票的解决方案是从 Eclipselink 回滚到 Toplink。有没有人在不回滚到toplink的情况下解决了这个问题?

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

更新

就我对这种情况的研究而言,看起来该错误已得到解决和修复?

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 的数据。

看起来错误是因为我在热部署时没有关闭实体管理器工厂?我必须调查。

4

3 回答 3

6

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

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

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

无论哪种方式,请在 EclipseLink 和 Glassfish 中记录一个带有详细信息的错误,因为应该跟踪这个问题。

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

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

于 2011-03-02T14:10:58.070 回答
2

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

于 2011-02-25T07:43:21.093 回答
-1

今天我遇到了同样的问题,但我在persistence.xml中更正了

  1. 请检查实体类名称和包是否在 persistence.xml 中正确定义。
于 2011-02-28T08:49:03.420 回答