Bom dia Pessoal;
Estou com um problema a tempos, e tenho estudado bastante, mais ainda não consegui resolver… por isso peço a ajuda de todos;
Utilizo JSF 1.2 (RichFaces) e Hibernate 3, e implementei o padrão Open Session in View q segue
FiltroHibernate
public class FiltroHibernate implements Filter{
public void init(FilterConfig config) throws ServletException{
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{
try{
HibernateUtility.beginTransaction();
ControleExcecao.causa = null;
ControleExcecao.excecao = null;
ControleExcecao.informacao = null;
ControleExcecao.confirmacao = null;
chain.doFilter(request, response);
HibernateUtility.commitTransaction();
}catch (HibernateException e) {
e.printStackTrace();
HibernateUtility.rollbackTransaction();
}finally{
HibernateUtility.closeSession();
}
}
public void destroy() {
}
HibernateUtility
public class HibernateUtility {
private static SessionFactory factory;
private static final ThreadLocal<Session> sessionThread = new ThreadLocal<Session>();
private static final ThreadLocal<Transaction> transactionThread = new ThreadLocal<Transaction>();
static {
//Bloco estático que inicializa o Hibernate
try {
factory = new Configuration().configure().buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
factory = null;
}
}
public static Session getSession() {
Session session = (Session) sessionThread.get();
if (session == null) {
session = factory.openSession();
sessionThread.set( session );
} return
sessionThread.get();
}
public static void closeSession() {
Session session = sessionThread.get();
if ( session != null && session.isOpen() ) {
sessionThread.set(null);
session.close();
}
}
public static void beginTransaction() {
Transaction transaction = getSession().beginTransaction();
transactionThread.set(transaction);
}
public static void commitTransaction() {
Transaction transaction = transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.commit();
transactionThread.set(null);
}
}
public static void rollbackTransaction() {
Transaction transaction = transactionThread.get();
if ( transaction != null && !transaction.wasCommitted() && !transaction.wasRolledBack() ) {
transaction.rollback();
transactionThread.set(null);
}
}
Tenho o objeto CargoDTO com várias listas… segue um pedaço do hbm dele
<set name="listaCargoConhecimento" table="tab_cargoconhecimento" inverse="false">
<key column="crgoSeq"/>
<composite-element class="br.sdg.recursoshumanos.controle.CargoConhecimentoDTO">
<parent name="cargo"/>
<many-to-one name="conhecimento" column="conhSeq" class="br.sdg.recursoshumanos.controle.ConhecimentoDTO" not-null="true" />
<many-to-one name="usuario" column="usuaSeq" class="br.sdg.portal.UsuarioDTO" not-null="true" />
<property name="crcoDesc" />
</composite-element>
</set>
<set name="listaCargoAtividade" table="tab_cargoatividade" inverse="false">
<key column="crgoSeq" />
<composite-element class="br.sdg.recursoshumanos.controle.CargoAtividadeDTO">
<parent name="cargo" />
<many-to-one name="atividade" column="ativSeq" class="br.sdg.recursoshumanos.controle.AtividadeDTO"/>
<many-to-one name="tipoAtividade" column="tiatSeq" class="br.sdg.principal.dominio.TipoAtividadeDTO" />
</composite-element>
</set>
<set name="listaCargoComplexidade" table="tab_cargocomplexidade" inverse="false">
<key column="crgoSeq" />
<many-to-many class="br.sdg.principal.dominio.TipoComplexidadeDTO" column="ticmSeq" />
</set>
Meu problema consiste no seguinte…
Tenho uma tela de manter, onde eu listo os cargos conforme os filtros selecionados em um componente HtmlExtendedDataTable
O usuário seleciona um Cargo, e clica em alterar, e eu redireciono o mesmo para a tela de edição…
Nessa tela de edição, cada lista do cargo fica dentro de uma aba (HtmlTabPanel), pra evitar a barra de rolagem.
O que eu não consigo é carregar as listas (e permitir a edição das mesmas, ou seja, adicionar e excluir itens da lista), pq a sessão já está fechada, e as listas não foram carregadas.
Tentei fazer um session.load no objeto, mais quando eu manipulo a lista (adiciono, ou excluo) objetos da mesma, o load retorna a lista para o seu estado anterior, acabando com minha modificação…
Alguem sabe o q estou fazendo de errado??? Se precisarem de mais códigos para analisarem a minha situação é só falar…
desde já agradeço por toda a ajuda…