Hibernate: "no persistent classes found for query class

Boa tarde a todos.

Estou precisando de uma pequena ajuda. Comecei a utilizar hibernate já há um tempo, mas, tenho certa resistencia a usar a configuração por XML, então estou agora aprendendo a configurar um ambiente hibernate com annotations.

Tenho uma classe, chamada Usuario, declarada da seguinte forma:

package br.com.beans;

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

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity()
@Table (name="usuario")
public class Usuario {
	private Integer id;
	private String login;
	private String email;
	private char sexo;
	private String senha;
	
	/* ------------------ Construtores ------------------ */
	
	public Usuario(){}
	
	public Usuario(String login, String senha){
		this.login = login;
		this.senha = senha;
	}
	
	/* ---------------- Getters e Setters ---------------- */
	
        @Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public Integer getId() {
		return id;
	}
	@Column
	@NotNull
	public String getLogin() {
		return login;
	}
...

Costumo criar todas minhas tabelas no banco em low case, só para padronizar. No caso, pelo que li, uso a anotação @Table setando o atributo name com o nome da tabela conforme o banco, para fazer a associação de forma correta.

Estou utilizando o arquivo hibernate.cfg.xml, com a seguinte configuração:

<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.url">
			jdbc:mysql://localhost:3306/meu_banco
		</property>
		<property name="hibernate.connection.driver_class">
			com.mysql.jdbc.Driver
		</property>
		<property name="hibernate.connection.username">usuario</property>
		<property name="hibernate.connection.password">senha</property>
		<property name="hibernate.connection.pool_size">0</property>
		<property name="hibernate.dialect">
			org.hibernate.dialect.MySQLInnoDBDialect
		</property>
		<property name="hibernate.show_sql">false</property>
		
		<!-- "Import" the mapping resources here -->
		<mapping class="br.com.beans.Usuario"/>
		
	</session-factory>
</hibernate-configuration>

Para testar, dentro de um DAO que extende HibernateDaoSupport, tenho o código:

List result = session.createQuery("from "+Usuario.class.getName()).list();

Porém, não consigo fazer consultas, tenho o warn:

WARN  [QuerySplitter] no persistent classes found for query class: from br.com.beans.Usuario

Achei que alguma configuração estava errada/incompleta, mas, quando inicio o jboss (uso o jboss 4.0.5) vejo no log:

...
INFO  [Version] Hibernate Annotations 3.2.0.GA
INFO  [Configuration] configuring from resource: /hibernate.cfg.xml
INFO  [Configuration] Configuration resource: /hibernate.cfg.xml
[Configuration] Configured SessionFactory: null
[AnnotationBinder] Binding entity from annotated class: br.com.beans.Usuario
INFO  [EntityBinder] Bind entity br.com.beans.Usuario on table usuario
...

Esse trecho me faz pensar que está tudo certo, mas, não consigo entender então o erro que está ocorrendo. Alguém pode me dar uma orientação? (se tiver esquecido de mencionar alguma configuração, é só me falar. Mas, tenho o java 1.5.0_09, a aplicação em questão conta também com o spring 2.0, e a inicialização do jboss não me relata nenhum erro. O referido erro ocorre quando quero acessar algum método do dao).

Obrigada.

Uma dúvida, há algum registro nesta tabela? Porque é muito estranho… muitas pessoas se enganam e usam Entity do pacote do hibernate, mas você usou o javax.persistence o que está correto…

Tente remover o () da annotation @Entity.

Acho que quando não se seta nada não deve colocar parênteses…

:okok:

Marcos, sim, tenho um registro de usuário cadastrado, estou testando validação dele. Eu removi o () de Entity, mas, o problema persiste…

Fiz um novo teste, de inserção dessa vez, para ver o que dava, e temos uma nova pista. Tentei inserir um teste básico assim:

/*Teste de cadastro*/ Usuario teste = new Usuario("teste", "teste"); teste.setEmail("teste@teste.com"); teste.setSexo('M'); getHibernateTemplate().save(teste);

E retornou o seguinte erro:

ERROR [[locadora]] Servlet.service() for servlet locadora threw exception org.hibernate.MappingException: Unknown entity: br.com.beans.Usuario

Vou continuar pesquisando, caso tenha qualquer novidade postarei aqui.

Marcos, obrigada pela sua dica.

Caso tenham mais dicas, ou de repente sugerir um teste para vermos o que ocorre, agradeço muito também.

Obrigada.

hmm, acredito que a informação abaixo tb é válida, inicializo meu DAO da seguinte forma:

public UsuarioDAO(){ factory = new AnnotationConfiguration() .configure() .buildSessionFactory(); }

para construir a sessão (factory é uma SessionFactory).

Realmente começo a ficar sem opções. Tentei alguns testes, entre eles alterar a forma de inicialização do DAO para adicionar minha classe (para ver o que ocorria) da seguinte forma:

AnnotationConfiguration cfg = new AnnotationConfiguration(); cfg.configure(); cfg.addAnnotatedClass(Usuario.class); factory = cfg.buildSessionFactory();

Mas, continuo com o mesmo problema:

E, quanto tento inserir um registro, continuo com o erro:

Não alterei o modo como tento listar ou inserir. Vejo que o hibernate não está reconhecendo o mapeamento (pelo menos, pela mensagem é o que percebo), mas, não vejo em qual passo estou errando :cry:

Alguém já passou/viu situação semelhante?

Bom, retorno depois de muito o que ler/testar. Não consegui consertar a aplicação anterior, então construi uma outra aplicação do zero, depois de ler e reler o guia de referencia de annotations do hibernate (http://www.hibernate.org/hib_docs/annotations/reference/en/html/index.html), que funcionou bacana (bom, quase). Para funcionar tudo, e enxergar o mapeamento, tive que mapear as classes na configuração do hibernate.

Arquivo hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
  	<!-- Mapeamento das Classes -->
    <mapping package="org.test.bean"/>
    <mapping class="org.test.bean.Usuario"/>
  </session-factory>
</hibernate-configuration>

Curioso é que parece que a tag <mapping package=“org.test.bean”/> não está funcionando (no console diz que não achou o pacote).

Aí, ele fez o mapeamento corretamente, consigo listar, inserir, etc normalmente. Mas, tenho um outro problema, que ainda estou pesquisando solução, e gostaria de ver se alguém já fez da mesma forma: como disse, não gosto de fazer muitas configurações por XML, e não acho bacana ter que editar um XML sempre que criar um novo Bean. Então, queria adicionar as classes anotadas pelo código mesmo. Porém, se coloco no código do meu construtor no DAO o seguinte:

UsuarioDAO

[code]
public UsuarioDAO(){
sessionFactory = new AnnotationConfiguration()

    .addPackage&#40;&quot;br.com.froes.helpdesk.beans&quot;&#41; //the fully qualified package name
    .addAnnotatedClass&#40;Usuario.class&#41;
    .buildSessionFactory&#40;&#41;;

}[/code]

Para incluir pelo código as classes mapeadas, ele começa a dar o seguinte erro:

Console

15&#58;01&#58;40,250 INFO &#91;LocalSessionFactoryBean&#93; Closing Hibernate SessionFactory 15&#58;01&#58;40,250 INFO &#91;SessionFactoryImpl&#93; closing 15&#58;01&#58;40,250 ERROR &#91;ContextLoader&#93; Context initialization failed org.springframework.beans.factory.BeanCreationException&#58; Error creating bean with name 'myObjectDaoIdBEan' defined in ServletContext resource &#91;/WEB-INF/applicationContext-dao.xml&#93;&#58; Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException&#58; Could not instantiate bean class &#91;org.test.dao.UsuarioDAO&#93;&#58; Constructor threw exception; nested exception is org.hibernate.HibernateException&#58; Hibernate Dialect must be explicitly set Caused by&#58; org.springframework.beans.BeanInstantiationException&#58; Could not instantiate bean class &#91;org.test.dao.UsuarioDAO&#93;&#58; Constructor threw exception; nested exception is org.hibernate.HibernateException&#58; Hibernate Dialect must be explicitly set Caused by&#58; org.hibernate.HibernateException&#58; Hibernate Dialect must be explicitly set at org.hibernate.dialect.DialectFactory.determineDialect&#40;DialectFactory.java&#58;57&#41; at org.hibernate.dialect.DialectFactory.buildDialect&#40;DialectFactory.java&#58;39&#41; ...

O dialeto está setado, porém, via XML.

applicationContext-dao.xml

[code]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

&lt;bean id=&quot;sessionFactory&quot; class=&quot;org.springframework.orm.hibernate3.LocalSessionFactoryBean&quot;&gt;

	&lt;property name=&quot;dataSource&quot;&gt;
		&lt;ref bean=&quot;dataSource&quot;/&gt;
	&lt;/property&gt;

	&lt;property name=&quot;configLocation&quot;&gt;
		&lt;value&gt;WEB-INF/hibernate.cfg.xml&lt;/value&gt;
	&lt;/property&gt;

	&lt;property name=&quot;configurationClass&quot;&gt;
		&lt;value&gt;org.hibernate.cfg.AnnotationConfiguration&lt;/value&gt;
	&lt;/property&gt;

	&lt;property name=&quot;hibernateProperties&quot;&gt;
		&lt;props&gt;
			&lt;prop key=&quot;hibernate.dialect&quot;&gt;org.hibernate.dialect.MySQLInnoDBDialect&lt;/prop&gt;
			&lt;prop key=&quot;hibernate.hbm2ddl.auto&quot;&gt;update&lt;/prop&gt;
		&lt;/props&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;bean id=&quot;transactionManager&quot; class=&quot;org.springframework.orm.hibernate3.HibernateTransactionManager&quot;&gt;
	&lt;property name=&quot;sessionFactory&quot;&gt;
	&lt;ref bean=&quot;sessionFactory&quot;/&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;bean id=&quot;txAttributeSource&quot; class=&quot;org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource&quot;&gt;

&lt;property name=&quot;properties&quot;&gt;
	&lt;props&gt;
		&lt;prop key=&quot;add*&quot;&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
		&lt;prop key=&quot;update*&quot;&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
		&lt;prop key=&quot;remove*&quot;&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
		&lt;prop key=&quot;send*&quot;&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
	&lt;/props&gt;
&lt;/property&gt;

</bean>

&lt;bean id=&quot;txInterceptor&quot; class=&quot;org.springframework.transaction.interceptor.TransactionInterceptor&quot;&gt;
	&lt;property name=&quot;transactionManager&quot;&gt;
		&lt;ref local=&quot;transactionManager&quot;/&gt;
	&lt;/property&gt;

	&lt;property name=&quot;transactionAttributeSource&quot;&gt;
		&lt;ref local=&quot;txAttributeSource&quot;/&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;bean id=&quot;autoProxyCreator&quot; class=&quot;org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator&quot;&gt;
	&lt;property name=&quot;interceptorNames&quot;&gt;
		&lt;list&gt;
			&lt;idref local=&quot;txInterceptor&quot;/&gt;
		&lt;/list&gt;
	&lt;/property&gt;
	&lt;property name=&quot;beanNames&quot;&gt;
		&lt;list&gt;
			&lt;value&gt;*Dao&lt;/value&gt;
			&lt;value&gt;*DAO&lt;/value&gt;
		&lt;/list&gt;
	&lt;/property&gt;
&lt;/bean&gt;


&lt;bean id=&quot;myObjectDaoIdBEan&quot; class=&quot;org.test.dao.UsuarioDAO&quot;&gt;
	&lt;property name=&quot;sessionFactory&quot;&gt;
		&lt;ref bean=&quot;sessionFactory&quot;/&gt;
	&lt;/property&gt;
&lt;/bean&gt;

</beans>[/code]

Pelo que percebo, ele chama o construtor do meu DAO antes de ler as configurações do arquivo XML. Caso seja isso mesmo, existe uma forma de força-lo a ler o XML antes? Se não for, o que está ocorrendo então?

Utilizo o Hibernate 3, Spring 2.0 e Jboss 4.0.5. Se precisar de mais algum dado, é só me dar o toque.

Brigadu!!!
:slight_smile: