2011-02-23 12 views
8

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.

  1. Deploy applicazione web attraverso Netbean (Si aprirà il browser)

  2. 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" ???)

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

+0

Ma non dovrei chiudere l'istanza EntityManagerFactory poiché è singleton. Dovrei solo chiuderlo e creare una nuova istanza durante la distribuzione a caldo ..? confondermi –

risposta

6

Come si sta creando EntityManager/Factory, è gestito o non gestito?

Se non è gestito, quindi credo che EclipseLink non verrà notificato in alcun modo di una ridistribuzione, quindi avrà ancora la vecchia EntityManagerFactory memorizzata nella cache in quanto non viene mai chiusa. Puoi assicurarti di chiudere EntityManagerFactory dopo la distribuzione a caldo?

È possibile rendere l'unità di persistenza un'unità di persistenza gestita, che potrebbe risolvere il problema.

In entrambi i casi, si prega di registrare un bug per questo con dettagli in EclipseLink e Glassfish, in quanto questo problema dovrebbe essere tracciato.

Penso che questo possa essere il bug, https://bugs.eclipse.org/bugs/show_bug.cgi?id=326552

prega di votare per questo bug, e includere le informazioni in esso.

+0

Ho postato qualche aggiornamento sulla mia area domande, per favore date un'occhiata come risposta;) –

2

La soluzione here utilizza JPA 1.0 se 2.0 non è richiesto.

+0

Sì, ho collegato l'url già nella domanda .. Sto cercando una risposta se è stata apportata qualche correzione o qualche problema, tranne il rollback su Toplink che è JPA 1.0 –

+0

Ho cercato in giro molto ma ancora non riesco a trovare alcuna buona informazione –

+0

Purtroppo sono d'accordo, sembra che il problema abbia a che fare con alcune combinazioni di netbeans, glassfish, eclipselink, JPA2 e Toplink. –

-1

Oggi ho affrontato lo stesso proble, ma ho corretto in persistence.xml

  1. Si prega di verificare con il nome della classe di entità e il pacchetto siano correttamente definite persistence.xml.
+0

Puoi postare qualche esempio? –

Problemi correlati