Я создаю веб-приложение REST, используя Netbean6.9.1 и JPA EclipseLink.
] Проблема, с которой я столкнулся, заключается в том, что хотя мой класс сущностей MasatoTable отмечен аннотацией Entity, я получаю сообщение об ошибке:
(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
org.eclipse.persistence.jpa.PersistenceProvider
jdbc/koga_kojo
entity.MasatoTable
Похоже на ту же проблему, но решение этой проблемы - откат на Toplink из Eclipselink. Кто-нибудь решил проблему без отката к toplink?
ОБНОВЛЕНИЕ
Что касается моего исследования в отношении этого случая, похоже, что ошибка устранена и исправлена?
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141
Я недостаточно осведомлен, чтобы понять все, но нашел несколько фактов:
Netbean6.9 . 1 предоставляет EclipseLink 2.0.1, тогда как самая новая версия - 2.2.0
Я загрузил самую новую версию и поместил их в каталог lib, а затем повторно развернул, но безуспешно, проблема все еще сохраняется. Не уверен, что сделал что-то неправильно.
ОБНОВЛЕНИЕ после комментария Джеймса
Ниже показан класс, который я использую для создания 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)
Я также обнаружил, что ошибка "неизвестный класс объектного компонента"
в теме наверняка обнаруживается следующим образом действие.
Развертывание веб-приложения через Netbean (откроется браузер)
Измените код в IDE Netbean и сохраните его. Затем Netbean будет автоматически повторно развернуть, как только вы нажмете кнопку сохранения (это называется «горячее развертывание» ???).
Вернитесь в браузер и выполните некоторые действия, такие как добавление данных, которые включают EntityManager.
Похоже, ошибка возникает из-за того, что я не закрываю фабрику диспетчера сущностей при горячем развертывании? Я должен провести расследование.