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