Query.list() ou criteria.list() vazios (há dados nas tabelas)

3 respostas
Fox_McCloud

Após configurar a minha aplicação WEB no Tomcat 6 com Spring e Spring MVC, Hibernate e entidades anotadas, ao efetuar uma listagem o resultado das listagens vem vazio, mas os dados foram inseridos corretamente utilizando as mesmas entidades de maneira direta com o Configuration e o addAnnotatedClass() (um select direto na base traz os dados inseridos).

Todas as injeções das camadas funcionam corretamente e o EntityManager é injetado corretamente utilizando @PersistenceContext.

Imagino que por algum motivo as entidades anotadas não são encontradas, embora de acordo com o manual e a minha experiência não seja necessário declarar as entidades nesse caso (seja no persistence.xml ou outro local).

Dicas são bem-vindas, obrigado. :wink:

O contexto do Spring é carregado corretamente via web.xml, e há configurações no contexto da minha aplicação web, o xml requerido pelo Spring MVC, mas omitirei as configurações não pertinentes ao problema.

Meu hibernateContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" lazy-init="false">
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
		<property name="ignoreResourceNotFound" value="true"/>
		<property name="location" value="/WEB-INF/conf/hibernate.properties" />
	</bean>
	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${hibernate.driverClassName}" />
		<property name="url" value="${hibernate.url}" />
		<property name="username" value="${hibernate.username}" />
		<property name="password" value="${hibernate.password}" />
		<property name="initialSize" value="${hibernate.initialSize}"/>
		<property name="maxActive" value="${hibernate.maxActive}"/>
		<property name="maxWait" value="${hibernate.maxWait}"/>
	</bean>
	
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="persistenceXmlLocation" value="META-INF/persistence.xml"/>
		<property name="persistenceUnitName" value="persistence"/>
	    <property name="jpaVendorAdapter">
		    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
		        <property name="showSql" value="${hibernate.show_sql}"/>
		        <property name="generateDdl" value="${hibernate.generate_ddl}" />
		        <property name="database" value="${hibernate.database}"/>
		     </bean>
	    </property>
		<property name="loadTimeWeaver">
			<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
		</property>
	</bean>
	
	<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
	
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<tx:annotation-driven transaction-manager="transactionManager" mode="proxy"/>
	
	<!-- Importante: registrando classes anotadas. -->
	<context:component-scan base-package="br.com.metodofacil.modelo.dao" />
	
</beans>
Meu persistence.xml:
<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_1_0.xsd"
		version="1.0">
	<persistence-unit name="persistence" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.cache.use_query_cache" value="false"/>
			<property name="hibernate.cache.use_second_level_cache" value="false"/>
		</properties>
	</persistence-unit>
</persistence>
Meu DAO:
package br.com.metodofacil.modelo.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.springframework.stereotype.Repository;

import br.com.metodofacil.modelo.dao.base.DAOBase;
import br.com.metodofacil.modelo.entidade.ItemMenu;

@Repository
public class DAOItemMenu extends DAOBase {

	@SuppressWarnings("unchecked")
	public List<ItemMenu> listaItensMenu() {
		List<ItemMenu> list = null;
		Session session = getSession();
		
		Criteria criteria = session.createCriteria(ItemMenu.class)
				.addOrder(Order.asc("prioridadeRenderizacao"));
		list = (List<ItemMenu>)criteria.list(); // Traz lista vazia
		
		Query query = session.createQuery("from " + ItemMenu.class.getCanonicalName() + " itemMenu order by itemMenu.prioridadeRenderizacao");
		list = query.list(); // Traz lista vazia
		
		return list;
	}

}
O DAOBase:
package br.com.metodofacil.modelo.dao.base;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.hibernate.Session;
import org.hibernate.ejb.EntityManagerImpl;
import org.springframework.transaction.annotation.Transactional;

@Transactional
public abstract class DAOBase {

	@PersistenceContext
	protected EntityManager entityManager;

	protected Session getSession() {
		Session session = null;
		if(entityManager.getDelegate() instanceof EntityManagerImpl) {
			session = ((EntityManagerImpl)entityManager.getDelegate()).getSession();
		} else {
			session = (Session)entityManager.getDelegate();
		}
		return session;
	}
	
}

3 Respostas

Fox_McCloud

AAAAAND… INDEED!!

Ao tentar persistir uma entidade…

org.hibernate.MappingException: Unknown entity: br.com.metodofacil.modelo.entidade.ItemMenu

Dicas?

S

Esta classe esta com a anotação @Entity?

Fox_McCloud

Está sim. Eu realmente tive que adicionar as classes anotadas no persistence.xml com ….

Embora eu ache que há algum jeito de configurar o sistema sem isso, talvez pelo fato de não utilizar conexão JNDI no Tomcat (o que implica em ) isso seja necessário.

Enfim… assim funcionou…!

Criado 15 de setembro de 2011
Ultima resposta 17 de set. de 2011
Respostas 3
Participantes 2