JPA : Unknown entity

Pessoal,
bom dia,

Estou fazendo uma aplicação EJB3 onde tenho a seguinte estritura

MeuEAR/
+Lib/
+++Util.jar
+EJB01.jar
+EJB02.jar
+META-INF/
+++persistence.xml

estou fazendo deploy no Jboss6.0

dentro do meu EJB01 tenho alguns ejbs auxiliares que fazem a persistencia, nele estão contidos os "DAOs"
porem as classes Entity estão no EJB02.

Até ai tudo bem, porque meu persistence.xml está no META-INF do EAR.
o problema é que a aplicação é enorme, e são adicionadas tabelas nele a cada semana e não gostaria de toda vez que adicionasse um Entity fosse necessário alterar o persistence.xml.

sei que no Hibernate existe uma propriedade hibernate.archive.autodetection, justamente para localizar Entity no classpah, mas não está funcionando.

<?xml version="1.0" encoding="UTF-8"?>
<persistence 
  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" 
	version="2.0">
	<persistence-unit name="juvoUnit" transaction-type="JTA">
	
	    <provider>org.hibernate.ejb.HibernatePersistence</provider>
	    
	    <jta-data-source>java:MeuDS</jta-data-source>
	    <properties>
 	         <property name="hibernate.archive.autodetection" value="class"/>	    
                 <property name="hibernate.show_sql" value="true"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
                <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />		
	     </properties>
	</persistence-unit>
</persistence>

quando tento persistir um entity ele mostra a seguinte mensagem

09:14:10,771 ERROR [STDERR] java.lang.IllegalArgumentException: Unknown entity: br.com.empresa.projeto.Banco

09:14:10,771 ERROR [STDERR] 	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:675)

09:14:10,771 ERROR [STDERR] 	at org.jboss.jpa.impl.tx.TransactionScopedEntityManager.persist(TransactionScopedEntityManager.java:206)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

09:14:10,771 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Method.java:601)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeTarget(MethodInvocation.java:122)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:111)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptors.container.ContainerMethodInvocationWrapper.invokeNext(ContainerMethodInvocationWrapper.java:72)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.invoke(InterceptorSequencer.java:76)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptors.aop.InterceptorSequencer.aroundInvoke(InterceptorSequencer.java:62)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

09:14:10,771 ERROR [STDERR] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

09:14:10,771 ERROR [STDERR] 	at java.lang.reflect.Method.invoke(Method.java:601)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.advice.PerJoinpointAdvice.invoke(PerJoinpointAdvice.java:174)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.fillMethod(InvocationContextInterceptor.java:74)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_fillMethod_19702872.invoke(InvocationContextInterceptor_z_fillMethod_19702872.java)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:90)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_19702872.invoke(InvocationContextInterceptor_z_setup_19702872.java)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.async.impl.interceptor.AsynchronousServerInterceptor.invoke(AsynchronousServerInterceptor.java:128)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:62)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:56)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:68)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.core.context.SessionInvocationContextAdapter.proceed(SessionInvocationContextAdapter.java:95)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:247)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:349)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invoke(CMTTxInterceptor.java:209)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx2.aop.CMTTxInterceptorWrapper.invoke(CMTTxInterceptorWrapper.java:52)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:182)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:41)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.core.context.CurrentInvocationContextInterceptor.invoke(CurrentInvocationContextInterceptor.java:47)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)

09:14:10,771 ERROR [STDERR] 	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)

09:14:10,771 ERROR [STDERR] 	at org.jboss.ejb3.interceptor.EJB3TCCLInterceptor.invoke(EJB3TCCLInterceptor.java:86)

cara,

o jpa reconhece automatico as entidades, veja como eu faço o meu e funciona perfeito

<persistence-unit name="NOME" >
		<jta-data-source>java:/MEUDS</jta-data-source>
		<properties>			
	        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
	        <property name="hibernate.show_sql" value="true"/>
	        <property name="hibernate.format_sql" value="true"/>
	    </properties>
	</persistence-unit>

coloca o codigo da sua entidade, para ver que o problema.

t+

Parece que vc não declarou o br.com.empresa.projeto.Banco no persistence.xml

Olá alissonvla, deixei meu persistence.xml igual o que vc postou e continuo com o mesmo erro

segue a minha entidade

package br.com.empresa.projeto;
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;

import com.framework.BasicValueObject;

@Entity
@Table(name="BANCO")
public class BancoValueObject extends BasicValueObject {

 
   @Id
   @GeneratedValue(strategy=GenerationType.AUTO)
   public long id;
   public String nome;
   public String codigoBacen;

   public Banco() {
      super("");
   }
   
   public Banco(String version) {
      super(version);
   }

   public Banco(String version, long id, String nome, String codigoBacen) {
      super(version);
      this.id = id;
      this.nome = nome;
      this.codigoBacen = codigoBacen;
   }


   public void setNome(String nome) {
      this.nome = nome;
   }

   public void setId(long id) {
      this.id = id;
   }

   public void setCodigoBacen(String codigoBacen) {
      this.codigoBacen = codigoBacen;
   }

   public String getCodigoBacen() {
      return codigoBacen;
   }


   public long getId() {
      return id;
   }


   public String getNome() {
      return nome;
   }

}

é justamente isso que eu não quero fazer.

estranho, so por curiosidade, sua entidade BasicValueObject implementa Serializable, a unica coisa que eu vejo de diferente dos meus projetos. Mas tenta dar um clean no seu projeto e dar um limpada no seu servidor.

t+

Sim, o BasicValueObject implementa Serializable, já limpei o servidor. snif… não sei mais o que fazer.

é justamente isso que eu não quero fazer.[/quote]
Tem que declara o comando de SCAN então…o JPA não vai do nada carregar sua entidade.

vamos partir para outro lado…rs
vc ta apontando sua aplicação para o banco certo, seu banco tem essa tabela que vc mapeando.

t+

é justamente isso que eu não quero fazer.[/quote]
Tem que declara o comando de SCAN então…o JPA não vai do nada carregar sua entidade.[/quote]

qual o comando SCAN???

eu já tinha marcado <property name=“hibernate.archive.autodetection” value=“class”/> mas não funcionou.

[quote=alissonvla]vamos partir para outro lado…rs
vc ta apontando sua aplicação para o banco certo, seu banco tem essa tabela que vc mapeando.

t+[/quote]

então… o persistencia, conexão com banco está tudo OK, se colocar o como o FernandoFranzini havia dito, funciona, só que não quero fazer isso.

a ideia é empacotar o primeiro EJB e não mecher mais nele.

se precisar mapenar as classes em outro lugar eu prefiro, mas não no persistence.xml

Cada provedor de JPA faz de uma forma…consulte material do seu.

cara,

acho q isso pode ser o problema, o persistence.xml nao tem que ficar no projeto aonde está as entidades, por isso que não preciso adiciona-lo o class no xml.

t+

cara,
coloquei o persistence.xml no jar que possui as entidades, e funcionou, porem eu vou ter vários jars com entidades, utilizando o mesmo unit, tentei copiar o persistence.xml em cada projetos e deu pau.

ou seja, não posso colocar o persistence.xml dentro do jar que possui a entity, por isso que coloquei no EAR.

acho que sua solução é mapear todas as suas classes no persistence.xml

Fala pessoal, blz.

Estou com o mesmo problema em minha aplicação EJB 3.1, quando tento fazer um select utilizando método “createQuery” ele me gera um erro informando que não encontrou minha entidade Cliente:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [SELECT u FROM CLIENTE u WHERE u.usuario = :usuario AND u.senha = :senha]. Unknown entity type [CLIENTE].

Classe de implementaçao do dao onde chamo o método “entityManager.createQuery(”…")".

@Stateless
public class ClienteDAOImp implements ClienteDAO {

	@PersistenceContext(unitName = "GerenciadorEntidade")
	private EntityManager entityManager;
	
	public ClienteDAOImp() {
		super();
		
	}

	public Cliente autenticar(String usuario, String senha) {       
		Cliente cliente = null;
    	      Query query = this.entityManager.createQuery("SELECT u FROM cliente u WHERE u.usuario = :usuario AND u.senha = :senha");
		//Query query = this.entityManager.createNativeQuery("SELECT * FROM CLIENTE u WHERE u.usuario ='"+usuario+"' AND u.senha = '"+senha+"'");
		query.setParameter("usuario", usuario);
		query.setParameter("senha", senha);
		try {
		//	cliente = (Cliente) query.getSingleResult();			 
			return cliente;
		} catch (NoResultException e) {
			return null;
		}
	}

}

Classe entidade

package br.com.brproject.jpa.entity;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;

@Entity
@Table(name = "cliente")
public class Cliente implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "clienteSequenceId")
	@SequenceGenerator(name = "clienteSequenceId", sequenceName = "br_cliente_sequence_id", allocationSize = 1)
	@Column(name = "cliente_id")
	private long id;
	
	@Column(name = "usuario")
	private String usuario;
	
	@Column(name = "senha")
	private String senha;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}	

}

Detalhe é que quando eu utilizo o o método “createNativeQuery” (linha 15) a pesquisa é rotornada com sucesso. Estou pesquisando para tentar achar uma solução e pelo que lí a respeito é um problema bastante comum com aplicações EJB acredito que seja uma configuração bem específica, pois todas a outras que foram sugeridas no posts que li estão de acordo na aplicação.

pesistence.xml (gerneciado pelo glassfish)

<?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="GerenciadorEntidade">
		<class>br.com.brproject.jpa.entity.Cliente</class>
		<class>br.com.brproject.jpa.entity.Evento</class>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>
	</persistence-unit>
</persistence>

Se alguém tiver alguma idéia eu agradeço.

Abraço a todos.

tem que ficar assim

Query query = this.entityManager.createQuery("SELECT u FROM Cliente u WHERE u.usuario = :usuario AND u.senha = :senha");

t+

Salve alissonvla,

Então, é exatamente como está na linha 14.

Vlw pela resposta

nao cara,
presta atenção na sua linha 14, ta tudo minusculo, tem q ser igual o nome da sua classe, Cliente.

t+

Pensei que fosse isto tb, já tinha tentado cliente, Cliente , CLIENTE e nada de funfar.

Agora foi :oops:

Vlw pela força alissonvla