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.
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:
[code]
<?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>[/code]
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:
[code]
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;
}
}[/code]
O DAOBase:
[code]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;
}
}[/code]