Sto creando un'app Web REST utilizzando Netbean6.9.1 e JPA EclipseLink.Messaggio di errore della classe entità sconosciuta anche se l'entità è contrassegnata con l'annotazione @Entity
Il problema che sto affrontando è anche se la mia classe di entità MasatoTable è contrassegnato con Entity annotazione, ottengo l'errore:
(java.lang.IllegalArgumentException: Unknown entity bean class:
class entity.MasatoTable, please verify that this class
has been marked with the @Entity annotation.)
La cosa è quando si riavvia il server GlassFish3 da NetbeanIDE, funziona per un po 'e in qualche modo ad un certo punto, l'errore inizia a mostrare. Ho usato Toplink Essential e non ho avuto problemi, ma sono passato a EclipseLink e ri-defiend persistence.xml (mostrato sotto) e questo problema è iniziato. Ma non vedo alcun errore di codice che mi viene in mente ..
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>
Sembra che lo stesso problema, ma che la soluzione del biglietto è il rollback su Toplink da Eclipselink. Qualcuno ha risolto il problema senza tornare al toplink?
Unknown entity bean class after hot deploy: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0
UPDATE
quanto riguarda la mia ricerca va in termini di questo caso, guardare come il bug è stato affrontato e fissato?
https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141
io non sono abbastanza esperto per capire il tutto, ma ci sono alcuni fatti che ho trovato:
Netbean6.9.1 fornisce EclipseLink 2.0.1 mentre più nuova versione è 2.2.0
Ho scaricato la versione più recente e li ho inseriti nella directory lib, quindi è stata ri-distribuita, ma senza fortuna, il problema persiste ancora. Non sono sicuro se ho fatto le cose nel modo sbagliato.
UPDATE dopo il commento di James
Di seguito è la classe che uso per creare EntityManagerFactory Singleton e come viene utilizzato.
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
Come si usa:
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();
}
}
Guardando il mio codice, penso ... Non sto chiudendo EntityManagerFactory (sto chiudendo EntityManager in fine però)
Inoltre, ho trovato che l'errore "unknown entity bean class"
nell'argomento si presenta con la seguente azione.
Deploy applicazione web attraverso Netbean (Si aprirà il browser)
Variazione po 'di codice in Netbean IDE e salvarlo. Quindi Netbean verrà ridistribuito automaticamente non appena si preme il pulsante Salva (si chiama "hot deploy" ???)
Torna al browser e agisce come aggiungere alcuni dati che coinvolgono EntityManager.
Sembra che l'errore si verifichi perché non sto chiudendo il gestore di entità di fabbrica durante l'implementazione a caldo? Devo indagare.
Ma non dovrei chiudere l'istanza EntityManagerFactory poiché è singleton. Dovrei solo chiuderlo e creare una nuova istanza durante la distribuzione a caldo ..? confondermi –