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_statementdeclaraçã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