JPA : Unknown entity

19 respostas
M

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)

19 Respostas

A

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+

FernandoFranzini

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

M

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

}
M

é justamente isso que eu não quero fazer.

A

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+

M

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

FernandoFranzini

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

A

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+

M

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

qual o comando SCAN???

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

M

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+

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

FernandoFranzini

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

A

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+

M

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.

A

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

Dyener

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.

A

tem que ficar assim

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

t+

Dyener

Salve alissonvla,

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

Vlw pela resposta

A

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

t+

Dyener

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

Agora foi :oops:

Vlw pela força alissonvla

Criado 29 de setembro de 2011
Ultima resposta 27 de out. de 2011
Respostas 19
Participantes 4