2012-01-05 10 views
12

Entity:No [EntityType] è stato trovato per la classe chiave [...] nel Metamodel

@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> 

L'errore

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) 

Comportamento Ogni volta che riavvio il contenitore Web, tutto funziona correttamente per un paio di minuti e viene generato questo errore. Cosa mi manca?

EDIT:

Ora uso un soggetto sul campo di applicazione come bene e lo stesso errore si verifica per il Paese Entità. Sia Utente che Paese sono definiti come classi nel persistance.xml. Inoltre, le classi exclude-non-elencate sono impostate su false.

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) 

L'entità Paese:

@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; 

Ora che questa entità viene utilizzato su campo di applicazione e l'entità getta questo errore il Glassfish non si avvia completamente.

SECONDO EDIT: Sulla base del comportamento attuale sembra che inizia il web container e funziona bene fino a quando la prima distribuzione a caldo.

+0

Posso scommettere che stai usando Netbeans? Forse correlato: 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

Sto usando Eclipse Indigo Service Release 1 ma questo è l'errore esatto che ottengo. – TGM

+0

Non ne sono sicuro. Hai provato a impostare il tipo di transazione su JTA? Questa è anche la scelta più sensata in un'applicazione web Java EE (altrimenti devi scrivere manualmente/copypaste un sacco di codice brutto per iniziare, eseguire il commit e eseguire il rollback delle transazioni). L'ultimo stacktrace indica anche che stai eseguendo il lavoro JPA all'interno di un blocco di inizializzazione 'static'. In teoria dovrebbe funzionare bene, ma questa è una cattiva idea in un ambiente EE. Fatelo invece in un costruttore (post) di un bean con scope dell'applicazione. – BalusC

risposta

22

Il problema è il vostro Implementazione caldo della vostra applicazione. La vecchia unità di persistenza si sta aggirando nel server perché non hai mai chiuso la vecchia fabbrica, quindi dopo la distribuzione a caldo la fabbrica ha ancora le vecchie classi, quindi ottieni l'errore di cast della classe.

È necessario eliminare la vecchia unità di persistenza. Chiusura di EntityManagerFactory dovrebbe fare questo, come in un Servlet distruggere callback.

Se si utilizza un'unità di persistenza gestita, tutto dovrebbe essere ripulito automaticamente. Il problema sta nel modo in cui gestisci la tua unità di persistenza.

Penso che ci sia anche un bug per questo EclipseLink connesso, potresti voler votare per quell'errore.

1

È possibile aggiungere manualmente le classi a persistence.xml? Idealmente, non dovresti farlo, ma ti darebbe almeno un inizio.

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

+0

Ho provato anche quello. Stesso risultato Funziona bene per un po ', poi si blocca. – TGM

+0

Si potrebbe provare a sbarazzarsi dell'ID seriale generato. Forse sta cercando una versione diversa della classe? – kcdragon

+0

Sì, ma come spiegheresti il ​​fatto che l'applicazione funzioni per un po 'di tempo prima di fallire. – TGM

4

Una volta ho riscontrato un problema simile. Talvolta veniva lanciata l'eccezione, a volte no. Dopo un lungo periodo di debug, ho scoperto che era causato da un secondo file persistence.xml (contenente un'unità di persistenza con un nome identico) incluso in un altro jar sul classpath.

1

Avevo un problema simile in cui avevo rifatto il codice, cambiando i nomi delle classi e l'iniezione di risorse stava ancora cercando di iniettare il nome della vecchia classe.Rinominare la mia unità di persistenza ha risolto il problema (e in seguito il ripristino del nome ha reintrodotto il problema).

Aggiornamento: dopo ulteriori ricerche, mi sono imbattuto in un file jar per le mie lezioni di persistenza. L'avevo creato per risolvere un problema di build precedente. Ad aggravare il problema, avevo anche rinominato i miei progetti. Sebbene avessi cancellato il JAR di persistenza dal mio spazio di lavoro, era ancora in agguato intorno alle cartelle .xxx di eclipse con il vecchio nome del progetto. L'ho cancellato e tutti i riferimenti al vecchio progetto e la mia build è stata risolta, eliminando il messaggio No [EntityType].

Problemi correlati