2011-02-23 23 views
8

Estoy construyendo la aplicación web REST usando Netbean6.9.1 y JPA EclipseLink.Mensaje de error de clase de entidad desconocida aunque la entidad esté marcada con @Entity annotation

El problema que estoy enfrentando es a pesar de que mi clase de entidad MasatoTable está marcado con la entidad de anotación, me sale error:

(java.lang.IllegalArgumentException: Unknown entity bean class: 
    class entity.MasatoTable, please verify that this class 
has been marked with the @Entity annotation.) 

La cosa es al reiniciar el servidor de GlassFish3 NetbeanIDE, funciona para un tiempo y de alguna manera en algún momento, el error comienza a aparecer. Solía ​​utilizar Toplink Essential y no tuve ningún problema, pero he cambiado a EclipseLink y redefiní persistence.xml (como se muestra a continuación) y se inició este problema. Pero no veo ningún error de código que se me ocurre ..

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> 

Parece mismo problema, pero que La solución del ticket es retroceder a Toplink desde Eclipselink. ¿Alguien ha resuelto el problema sin volver al enlace superior?

Unknown entity bean class after hot deploy: netbeans 6.9 + glassfish 2.1 + eclipselink jpa 2.0

ACTUALIZACIÓN

En lo que a mi investigación va en términos de este caso, mira como el error se ha abordado y fija?

https://bugs.eclipse.org/bugs/show_bug.cgi?id=288141

No soy lo suficientemente bien para entender todo el asunto, pero hay algunos hechos que he encontrado:

Netbean6.9.1 proporciona EclipseLink 2.0.1 mientras que la más nueva versión es 2.2.0

Descargué la versión más reciente y la puse en el directorio de la lib y luego volví a desplegarla, pero no tuve suerte, pero el problema persiste. No estoy seguro de si hice las cosas de la manera incorrecta.

actualización después el comentario de James

A continuación se muestra la clase que utilizo para crear EntityManagerFactory Singleton y la forma en que se está utilizando.

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 

¿Cómo se 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(); 
     } 
    } 

Al mirar a mi código, creo ... No estoy cerrando EntityManagerFactory (estoy cerrando EntityManager en fin, aunque)

También encontré que el error "unknown entity bean class" en el tema aparece con seguridad con la siguiente acción.

  1. Implementar aplicación web a través NetBean (Esto abrirá el navegador)

  2. cambio algo de código en NetBean IDE y guardarlo. Entonces Netbean se volverá a implementar automáticamente tan pronto como presione el botón guardar (¿esto se llama "implementación en caliente" ???)

  3. Regrese al navegador y realice alguna acción como agregar algunos datos que involucren a EntityManager.

Parece que el error se produce porque no estoy cerrando el administrador de entidades de fábrica cuando se implementa en caliente? Tengo que investigar.

+0

Pero no debería cerrar la instancia de EntityManagerFactory ya que es singleton. Solo debería cerrarlo y crear una nueva instancia durante el despliegue en caliente ...? confundirse –

Respuesta

6

¿Cómo está creando su EntityManager/Factory, está gestionado o no?

Si no se gestiona, entonces creo que no se notificará a EclipseLink de ninguna manera una reorganización, por lo que aún se conservará en caché la anterior EntityManagerFactory ya que nunca se cierra. ¿Puedes asegurarte de cerrar EntityManagerFactory después de la implementación en caliente?

Puede hacer que la unidad de persistencia sea una unidad de persistencia administrada, que puede resolver el problema.

De cualquier forma, por favor inicie un error con detalles en EclipseLink y Glassfish, ya que este problema debe ser rastreado.

Creo que esto puede ser el fallo, https://bugs.eclipse.org/bugs/show_bug.cgi?id=326552

vote por este error, e incluyen su información en ella.

+0

He publicado alguna actualización en mi área de preguntas, por favor, eche un vistazo como respuesta;) –

2

La solución here es usar JPA 1.0 si no se requiere 2.0.

+0

Sí, vinculé la URL ya en la pregunta ... Estoy buscando una respuesta si se ha solucionado algún problema o alguna solución, excepto volver a Toplink, que es JPA 1.0 –

+0

He buscado mucho pero aún así no puede encontrar ninguna buena información. –

+0

Lamentablemente, estoy de acuerdo, parece que el problema tiene que ver con una combinación de netbeans, glassfish, eclipselink, JPA2 y Toplink. –

-1

Hoy i se enfrentó al mismo proble, pero me corrige en persistence.xml

  1. Consulte a nombre de la clase de entidad y el paquete se definen correctamente en persistence.xml.
+0

¿Se puede publicar alguna muestra? –

Cuestiones relacionadas