Сообщение об ошибке неизвестного класса сущности, даже если сущность помечена аннотацией @Entity

Я создаю веб-приложение REST с помощью Netbean6.9.1 и JPA EclipseLink.

проблема, с которой я сталкиваюсь, даже если мой класс сущности MasatoTable отмечен аннотацией сущности, я получаю ошибку:

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

вещь когда я перезапускаю сервер GlassFish3 из NetbeanIDE, он работает некоторое время и как-то в какой-то момент появляется ошибка. я использовал Toplink Essential и не имел проблем, но я изменился на EclipseLink и повторно defiend стойкость.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>

похоже на ту же проблему, но решение этого билета-откат в Toplink из Eclipselink. Кто-нибудь решил проблему, не откатываясь к toplink?

неизвестный класс сущности после горячего развертывания: 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

I загрузил новейшую версию и поместил их в lib dir, а затем повторно развернул, но не повезло, проблема все еще сохраняется. Не уверена, что поступила неправильно.

обновление после комментария Джеймса

Ниже приведен класс, который я использую для создания singleton 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 (это откроет браузер)

  2. измените код в IDE Netbean и сохраните его. Затем Netbean автоматически развернется, как только вы нажмете кнопку сохранения (это называется "горячее развертывание"???)

  3. вернуться назад чтобы браузер и предпринять некоторые действия, например, добавить некоторые данные, которые включают EntityManager.

похоже, что ошибка возникает, потому что я не закрываю фабрику entity manager при горячем развертывании? Я должен разобраться.

3 ответов


Как вы создаете свой EntityManager / Factory, он управляется или не управляется?

Если он не управляется, то я считаю, что EclipseLink не будет уведомлен каким-либо образом о передислокации, поэтому по-прежнему будет кэшироваться старый EntityManagerFactory, поскольку он никогда не закрывается. Можете ли вы убедиться, что закрываете EntityManagerFactory после горячего развертывания?

вы можете сделать блок сохраняемости управляемым блоком сохраняемости, который может решить проблему.

либо путь, пожалуйста, зарегистрируйте ошибку для этого с деталями в EclipseLink и Glassfish, так как эта проблема должна быть отслежена.

Я думаю, что это может быть ошибка, https://bugs.eclipse.org/bugs/show_bug.cgi?id=326552

пожалуйста, проголосуйте за эту ошибку и включите в нее свою информацию.


решение здесь использовать JPA 1.0, если 2.0 не требуется.


сегодня я столкнулся с той же проблемой, но я исправил настойчивость.в XML

  1. пожалуйста, проверьте с именем класса сущности и пакет правильно определены в постоянстве.XML.