Ajuda - JSF + Hibernate = Sessions [Two open Sessions || No - Session]

Pessoal!

Boa noite!
Estamos desenvolvendo uma aplicação usando JSF + Hibernate, e ocorre o seguinte:

:arrow: Temos o Método listar da Classe DAO que retorna uma lista e fecha a conexão.
:arrow: Temos ainda a Classe “Produto”

O Que acontece é que ao tentar salvar um objeto do tipo “Produto” a aplicação lança a execption “org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions”

PS: Se fecharmos a sessão (No session) não conseguimos trazer os atributos dos objetos relacionados (LAZY) e se não fecharmos ele lança a exception acima.


	private void initialize(){
		sessao = null;
		transacao = null;
	}


	public List listar(Class clazz, String campoStatus, String status)
			throws Exception {
		initialize();
		sessao = HibernateUtil3.getSessionFactory().openSession();
		transacao=sessao.beginTransaction();
		List objts;
		objts = null;
		if (status != "") {
			Criteria selectAll = sessao.createCriteria(clazz).add(
					Restrictions.eq(campoStatus, Boolean.valueOf(status)));
			objts = selectAll.list();
		} else {
			objts = sessao.createCriteria(clazz).list();
		}
		getCommit();
		return objts;
	}

	public void getCommit() {
		transacao.commit();
		try {
			if(sessao.isOpen())
			sessao.close();
		} catch (Exception e) {
			System.out.println("ERRO AO SALVAR");
		}

	}
public class Produto implements Serializable{
	private static final long serialVersionUID = 3061923303947856017L;
	@Id
	@GeneratedValue
	private	long id_produto;
	private String descricao; //Nome do produto
	@ManyToOne(fetch=FetchType.LAZY)
	private ValorProduto valorProduto;
	@ManyToMany(fetch=FetchType.LAZY)
	private List<IngredienteProduto> ingredienteProduto;
	private Double preco = new Double(0); // Para cadastro de exceções

Método Salvar DAO:

	public void salvar(Object obj) throws Exception {
		initialize();
		sessao = HibernateUtil3.getSessionFactory().openSession();
		transacao = sessao.beginTransaction();
		sessao.saveOrUpdate(obj);
		getCommit();
	}

Método Salvar Aplicação:


		public void Salvar(){
			try {
					new GenericDAO().salvar(valorProduto);					
					for (IngredienteProduto ip : target) {
						new GenericDAO().salvar(ip);
					}
				
					produto.setValorProduto(valorProduto);
					produto.setIngredienteProduto(target);
					
					dao.salvar(produto.getValorProduto());
					dao.salvar(produto.getValorProduto().getCategoria());
					dao.salvar(produto.getValorProduto().getTamanho());
                                        dao.salvar(produto);



	} catch (Exception e) {
				e.printStackTrace();
			}
		}

Desde já agradecemos :slight_smile:

Ninguém ? :frowning: :frowning: :shock: