Сообщение об ошибке неизвестного класса объекта, даже если объект помечен аннотацией @Entity - PullRequest
8 голосов
/ 23 февраля 2011

Я создаю веб-приложение 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 и повторно открыл файл persistence.xml (показан ниже), и эта проблема началась. Но я не вижу ни одной ошибки в коде, о которой я могу думать ..

MasatoTable.java

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

persistence.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

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 (откроется браузер)

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

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

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

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

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

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

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

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

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

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

2 голосов
/ 25 февраля 2011

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

0 голосов
/ 28 февраля 2011

Сегодня я столкнулся с той же проблемой, но я исправил в файле persistence.xml

  1. Пожалуйста, проверьте правильность определения имени класса сущности и пакета в файле persistence.xml.
...