Я создаю веб-приложение 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"
в теме наверняка обнаружится со следующим действием.
Развертывание веб-приложения через Netbean (откроется браузер)
Измените некоторый код в Netbean IDE и сохраните его. Затем Netbean автоматически повторно развернется, как только вы нажмете кнопку сохранения (это называется «горячее развертывание» ???)
Вернитесь в браузер и выполните некоторые действия, например, добавьте некоторые данные, которые включают EntityManager.
Похоже, ошибка возникает из-за того, что я не закрываю фабрику диспетчера сущностей при оперативном развертывании? Я должен расследовать.