Buduję aplikację internetową REST, używając Netbean6.9.1 i JPA EclipseLink.Nieznany komunikat o błędzie klasy encji, mimo że encja jest oznaczona adnotacją @Entity
Emisja skierowana jest mi mimo mojej klasy podmiotu MasatoTable oznaczona Entity adnotacji, otrzymuję błąd:
(java.lang.IllegalArgumentException: Unknown entity bean class:
class entity.MasatoTable, please verify that this class
has been marked with the @Entity annotation.)
Rzecz kiedy ponownie uruchomić serwer GlassFish3 z NetbeanIDE, że pracuje dla chwilę i jakoś w pewnym momencie pojawia się błąd. Użyłem Toplink Essential i nie miałem problemu, ale zmieniłem EclipseLink i ponownie broniłem persistence.xml (pokazane poniżej) i ten problem zaczął się. Ale nie widzę żadnego błędu kodu, który można myślę ..
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>
Wygląda na to, że ten sam problem, ale rozwiązaniem biletu jest wycofanie do Toplink z Eclipselink. Czy ktoś rozwiązał problem bez powrotu do toplink?
Unknown entity bean class after hot deploy: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0
UPDATE
Jeśli chodzi o moje badania idzie w warunkach niniejszej sprawy, wygląda jak błąd został rozwiązany i stałe?
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141
nie jestem wystarczająco kompetentny, aby zrozumieć całość, ale istnieje kilka faktów znalazłem:
Netbean6.9.1 zapewnia EclipseLink 2.0.1 natomiast najnowsza wersja to 2.2.0
Pobrałem najnowszą wersję i umieściłem je w katalogu lib, a następnie ponownie wdrożono, ale bez powodzenia, problem nadal występuje. Nie jestem pewien, czy robiłem coś w niewłaściwy sposób.
UPDATE po komentarzu Jamesa
Poniżej jest klasa używam do tworzenia singleton EntityManagerFactory i jak jest on używany.
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
Jak stosować go:
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();
}
}
Patrząc na mojego kodu, myślę ... Ja nie zamykając EntityManagerFactory (jestem zamykania EntityManager w końcu chociaż)
Również znalazłem błąd "unknown entity bean class"
w temacie pojawia się na pewno z następującym działaniem.
Deploy web app przez Netbean (Spowoduje to otwarcie przeglądarki)
zmienić niektóre kod w Netbean IDE i zapisz go. Następnie Netbean automatycznie ponownie uruchomi się, gdy tylko naciśniesz przycisk zapisu (jest to tak zwane "hot deploy" ???)
Powróć do przeglądarki i wykonaj pewne czynności, np. Dodaj dane obejmujące EntityManager.
Wygląda na to, że wystąpił błąd, ponieważ nie zamykam fabryki podmiotu zarządzającego przy wdrażaniu na gorąco? Muszę to zbadać.
Ale nie powinienem zamykać instancji EntityManagerFactory, ponieważ jest to singleton. Powinienem go zamknąć i utworzyć nową instancję podczas instalacji na gorąco ...? wpada w zakłopotanie –