Problema com Sessão Hibernate e Lazy

4 respostas
georgesq

Colegas, tenho uma aplicação batch onde preciso buscar um projeto e logo depois carregar os seus ciclos, estes estão como lazy.
Estou utilizando Spring e Hibernate.

Segue o método:

public Project listAllCicleFromProject(Project domainObject) throws Exception {
		domainObject = this.get(domainObject);
		domainObject.getCicles();
		
		return domainObject;
	}

appContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<import resource="classpath*:applicationContext.xml"/>
<sa:annotation-autoload />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName">
		<value>com.mysql.jdbc.Driver</value>
	</property>
	<property name="url">
		<value>jdbc:mysql://localhost:3306/aa</value>
	</property>
    <property name="username"><value>root</value></property>
    <property name="password"><value>sa</value></property>
</bean>

<bean id="sessionFactory" class="net.sourceforge.sannotations.hibernate.AutomaticAnnotationSessionFactoryBean">
   <property name="configLocations" value="classpath*:hibernate.cfg.xml" />
   <property name="dataSource">
      <ref bean="dataSource" /> 
   </property>
</bean>

hibernate.cfg.xml

org.hibernate.dialect.MySQLDialect org.hibernate.dialect.MySQLDialect update true true after_statement

declaração do meu repository:

@Bean(name="projectRepositoryImplBean")
public class ProjectRepositoryImpl<T extends Project> extends HibernateBaseDAO<Project, Integer> implements ProjectRepository<Project, Integer>  {
}

minha classe de infra para os repository:

@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
public abstract class HibernateBaseDAO<T extends BaseData, PK extends Serializable> extends HibernateDaoSupport { 
	
	private Class<T> classe;
	
	public HibernateBaseDAO(final Class<T> classe) {
		this.classe = classe;
	}
	
	/**
	 * Implementação Base do método 'save' para todos os DAO's.
	 * 
	 * @see br.com.sysone.infra.spring.dao.orm.IBaseDAO#save(T)
	 * @param entity
	 * @exception DataAccessException
	 */
	public void save(T entity) throws DataAccessException {
		this.getHibernateTemplate().save(entity);
	}

	/**
	 * Implementação base do método 'update' para todos os DAO's.
	 * 
	 * @param entity
	 * @exception DataAccessException
	 * @see br.com.sysone.infra.spring.dao.orm.IBaseDAO#update(T)
	 */
	@SuppressWarnings("unchecked")
	public void update(T entity) throws Exception {
		this.getHibernateTemplate().update(entity);
	}

	/**
	 * Grava ou atualiza a entidade no repositório.
	 * 
	 * @param entity
	 * @throws DataAccessException
	 */
	public void saveOrUpdate(T entity) throws DataAccessException, Exception {
		this.getHibernateTemplate().saveOrUpdate(entity);
	}
	
	/**
	 * Implementação base do método 'delete' para todos os DAO's.
	 * 
	 * @exception DataAccessException
	 * @see br.com.sysone.infra.spring.dao.orm.IBaseDAO#delete(java.lang.Object)
	 */
	public void delete(T entity) throws DataAccessException {
		this.getHibernateTemplate().delete(entity);
	}

	/**
	 * Implementação base do método 'listAll' para todos os DAO's.
	 * 
	 * @param entity
	 * @exception DataAccessException
	 * @see br.com.sysone.infra.spring.dao.orm.IBaseDAO#listAll(java.lang.Object)
	 */
	@SuppressWarnings("unchecked")
	public Collection<T> listAll(T entity) throws Exception {
		Collection<T> result = this.getSession().createCriteria(classe).list();

		//FIXME solucao para FLEX
		for(T ett : result) {
			((BaseData) ett).resetRelations();
		}
		
		return (result.isEmpty() ? Collections.EMPTY_LIST : result);
	}

	/**
	 * Implementação para Listar dados com base nos atributos preenchidos da Entidade
	 * @param sql 
	 * @return
	 * @throws DataAccessException
	 */
	@SuppressWarnings("unchecked")
	public Collection<T> listByAnyThing(T entity) throws DataAccessException {
		StringBuilder sb = new StringBuilder("SELECT * FROM ").append(ObjectUtils.getTableName(entity));
		
		sb.append(QueryUtils.generateWhere(QueryUtils.createDynamicFilter(entity)));
		
		Collection<T> result = this.getSession().createSQLQuery(sb.toString()).list();

		return (result.isEmpty() ? Collections.EMPTY_LIST : result);
	}
	
	@SuppressWarnings("unchecked")
	public T get(T entity) throws Exception {
		return (T) this.getHibernateTemplate().get(this.classe, (Serializable) ClassUtils.getFieldValueByAnnotation(entity, Id.class));
	}
}

Pq a session esta sendo fechada logo após a execução do primeiro comando enviao ao hibernate, deveria fechar ao fim da transação, não?

Agradecido,
George

4 Respostas

D

Você configurou o arquivo web.xml (deployment descriptor)?
Há, num esquece de colocar tudo em Code tá? fica confuso ler como está.

Abraços

georgesq

como informei, isso não é uma aplicação web e sim stand alone.

[s]

_fs

Se não me engano só fazer

domainObject.getCicles(); não é suficiente para inicializar a coleção. Se estou certo, você pode:

  1. Realizer um select setando o FetchMode desta associação para EAGER.
  2. Chamar
  1. Chamar
D

georgesq:
como informei, isso não é uma aplicação web e sim stand alone.

[s]

Desculpe, não havia prestado atenção, mesmo porque é desnecessário utilizar nesse caso, ao meu ver, Spring e Hibernate, uma vez que o SQL com JDBC 4 pode dar uma boa conta do recado. Opinião pessoal.

Abraços e boa sorte

Criado 5 de abril de 2008
Ultima resposta 7 de abr. de 2008
Respostas 4
Participantes 3