2012-01-05 15 views
12

Entidad:nº [EntityType] se encontró para la clase de la clave [...] en el metamodelo

@Entity 
@Table(name="user_account") 
public class UserAccount implements Serializable{ 
    private static final long serialVersionUID = -2606506548742732094L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.TABLE) 
    private Integer id; 

persistence.xml

<persistence-unit name="Maze" transaction-type="RESOURCE_LOCAL"> 

    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mazedb"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value="root"/> 
    </properties> 

</persistence-unit> 

El error

WARNING: #{accountController.performLogin}: java.lang.IllegalArgumentException: No [EntityType] was found for the key class [com.maze.model.UserAccount] in the Metamodel - please verify that the [Entity] class was referenced in persistence.xml using a specific <class>com.maze.model.UserAccount</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
javax.faces.FacesException: #{accountController.performLogin}: java.lang.IllegalArgumentException: No [EntityType] was found for the key class [com.maze.model.UserAccount] in the Metamodel - please verify that the [Entity] class was referenced in persistence.xml using a specific <class>com.maze.model.UserAccount</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 
    at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:662) 

Comportamiento Cada vez que reinicio el contenedor web todo funciona bien durante un par de minutos y luego se produce este error. ¿Qué me estoy perdiendo?

EDIT:

ahora el uso de una entidad en el ámbito de aplicación, así y se produce el mismo error de la Entidad País. Tanto el usuario como el país se definen como clases en persistance.xml. Además, las clases exclude-no listadas se configuran en falso.

SEVERE: Critical error during deployment: 
java.lang.ExceptionInInitializerError 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39 ) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at java.lang.Class.newInstance0(Class.java:355) 
at java.lang.Class.newInstance(Class.java:308) 
at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:188) 
at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:102) 
at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:409) 
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:269) 
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:256) 
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:255) 
at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4750) 
at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:550) 
at org.apache.catalina.core.StandardContext.start(StandardContext.java:5366) 
at com.sun.enterprise.web.WebModule.start(WebModule.java:498) 
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917) 
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901) 
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733) 
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2000) 
at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1651) 
at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109) 
at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130) 
at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269) 
at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:294) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:462) 
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:382) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:355) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1064) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:96) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1244) 
at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1232) 
at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:459) 
at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:209) 
at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168) 
at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:238) 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
at java.lang.Thread.run(Thread.java:662) 
Caused by: java.lang.IllegalArgumentException: No [EntityType] was found for the key class [com.maze.model.Country] in the Metamodel - please verify that the [Entity] class was referenced in persistence.xml using a specific <class>com.maze.model.Country</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.entityEmbeddableManagedTypeNotFound(MetamodelImpl.java:174) 
at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.entity(MetamodelImpl.java:194) 
at org.eclipse.persistence.internal.jpa.querydef.AbstractQueryImpl.from(AbstractQueryImpl.java:97) 
at com.maze.service.CountryService.readList(CountryService.java:74) 
at com.maze.util.MazeConstants.<clinit>(MazeConstants.java:26) 

La entidad País:

@Entity 
@Table(name = "country") 
public class Country implements Serializable{ 

private static final long serialVersionUID = 4086034429815316972L; 

@Id 
private Integer id; 
private String name; 
private String continent; 
private Integer population; 
private Float surface; 

@OneToMany(mappedBy = "country") 
private List<User> userList; 

Ahora que esta entidad se utiliza en el ámbito de aplicación y la Entidad lanza este error del Glassfish no arranca por completo.

SEGUNDA EDICION: Según el comportamiento actual, parece que el contenedor web se inicia y funciona bien hasta la primera implementación en caliente.

+0

¿Puedo apostar que estás usando Netbeans? Posiblemente relacionado: http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/metamodel_api#DI_101:_20100218:_Descriptor.javaClass_is_null_on_a_container_EM_for_a_specific_case – BalusC

+0

Estoy usando Eclipse Indigo Service Release 1, pero ese es el error exacto que recibo. – TGM

+0

No estoy seguro. ¿Intentó establecer el tipo de transacción en JTA? Esa es también la elección más sensata en una aplicación web Java EE (de lo contrario, debe escribir/copiar manualmente una gran cantidad de código repulsivo feo para comenzar, confirmar y deshacer transacciones). Su última stacktrace también le dice que está haciendo el trabajo JPA dentro de un bloque de inicializador 'static'. En teoría, esto debería funcionar bien, pero esa es una mala idea en un entorno EE. Hágalo en un (post) constructor de un bean con ámbito de aplicación en su lugar. – BalusC

Respuesta

22

El problema es su despliegue en caliente de su aplicación. La vieja unidad de persistencia se queda en el servidor porque nunca cerraste la fábrica anterior, así que después del despliegue en caliente la fábrica todavía tiene las clases antiguas, por lo que obtienes el error de conversión de clase.

Debe borrar la unidad de persistencia anterior. El cierre de EntityManagerFactory debería hacer esto, como en un Servlet destroy callback.

Si usa una unidad de persistencia administrada, todo debe limpiarse automáticamente. El problema está en cómo está administrando su unidad de persistencia.

Creo que también hay un error para este EclipseLink conectado, es posible que desee votar por ese error.

1

¿Puede agregar las clases manualmente a persistence.xml? Idealmente, no deberías tener que hacer esto, pero al menos te daría un comienzo.

<persistence-unit><class>com.maze.model.UserAccount</class>...

+0

Lo intenté también. Mismo resultado. Funciona bien por un tiempo luego se cuelga. – TGM

+0

Puede intentar deshacerse de la identificación de serie generada. Tal vez está buscando una versión diferente de la clase? – kcdragon

+0

Sí, pero ¿cómo explicaría el hecho de que la aplicación funciona por algún tiempo antes de fallar? – TGM

4

Una vez encontré un problema similar. La excepción a veces se arroja, a veces no. Después de una dolorosa cantidad de tiempo de depuración descubrí que fue causado por un segundo archivo persistence.xml (que contiene una unidad de persistencia con un nombre idéntico) incluido en otro jar en el classpath.

1

Tuve un problema similar cuando tuve el código refactorizado, cambiando los nombres de clase, y la inyección de recursos todavía estaba intentando inyectar el nombre de la clase anterior.Cambiar el nombre de mi unidad de persistencia corrigió el problema (y, posteriormente, revertir el nombre reintrodujo el problema).

Actualización: después de una búsqueda más profunda, encontré un archivo jar para mis clases de persistencia. Lo había creado para solucionar un problema de compilación anterior. Para agravar el problema, tenía también y renombré mis proyectos. Aunque eliminé el JAR de persistencia de mi espacio de trabajo, todavía estaba colgando alrededor de las carpetas .xxx de eclipse bajo el nombre anterior del proyecto. Lo eliminé y todas las referencias al proyecto anterior, y mi compilación fue arreglada, eliminando el mensaje No [EntityType].

Cuestiones relacionadas