Jsf e Hibernate

4 respostas
L

Pessoal to com um probleminha nos metodos excluir e editar dos meus form`s JSF, o excluir nao funciona de jeito nenhum ,
e o editar so atualiza o DataModel mas nao persiste as mudancas da edicao no banco vou postar meus metodos aqui:
no controle

public String excluir() {
		IDaoEstado ldao = new DaoEstado();
		Estado estado = getEstadoFromEditOrDelete();
		setEstado(estado);
		ldao.excluir(estado);
	        addSuccessMessage("Estado excluido com sucesso.");
		return "sucessoDeleteEstado";

	}

               public Estado getEstadoFromEditOrDelete() {
		Estado estado = (Estado) model.getRowData();
		return estado;

	}

no dao

public void excluir(Estado objeto) {						
						session = HibernateUtil.getInstance();
						Transaction tx = null;

						try {
							tx = session.beginTransaction();
							session.merge(objeto);
							session.delete(objeto);
							session.flush();
							tx.commit();
							
						} catch (HibernateException e) {
						
				                        tx.rollback();
						} finally {
							session.close();
						}
					}

e na pagina ta assim, tenho um Datatable com os campos e os links a seguir

<h:column>

                    <h:commandLink value="#{msg.novo}" action="#{Estado.novo}"></h:commandLink> 
                    <h:commandLink value="#{msg.editar}" action="#{Estado.editar}"></h:commandLink> 
                    <h:commandLink value="#{msg.excluir}" action="#{Estado.excluir}" immediate="true"></h:commandLink>

                </h:column>

Que será que ocorre de errado ?
vlw,abraços.

4 Respostas

L

AEW na hora de excluir ta dando esta mensagem no console e nao exclui nada do banco:

10:29:18,953 ERROR [STDERR] org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
	at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
	at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:43)
	at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)

nao entendi direito,parece que tem duas sessoes abertas é isso?

L

consegui resolver o problema isolando tds metodos do dao e as consultas em transacoes.

D

oi Leandro,

tudo bem?

Vi que você resolveu seu problema de conexões abertas pelo hibernate quando utiliza o JSF.

Estou com o mesmo problema.

O método só dá o erro se eu acesso via o JSF. se eu executo o método pela classe de teste não dá o erro.

Meu DAO está assim:

public class OPDAO {

Session sessao;

public OPDAO() throws Exception{ 
	if (sessao == null) sessao = HibernateUtility.getSession(); 
	if (!sessao.isOpen()) sessao = HibernateUtility.getSession(); 

} 

public Session getSession() {
	
	if (!sessao.isOpen()) sessao = HibernateUtility.getSession();
	
	return sessao;
}



public OP addOP(OP op) {

	try{
		
	   	Transaction transaction = getSession().beginTransaction();
	   	sessao.save(op);  
	   	sessao.flush();  
		transaction.commit();
		
		op.setIdOP(getCodigoUltimaOP());
		    		
	}catch (Exception e) { 
		e.printStackTrace();
	} finally {   
		sessao.close();   
	} 

	return op;
}

public void updOP(OP op) {

	try{

	
	
	   	Transaction transaction = getSession().beginTransaction();
	   	sessao.update(op);  
	   	sessao.flush();  
		transaction.commit();
	
		    		
	}catch (Exception e) { 
		e.printStackTrace();
	} finally {   
		sessao.close();   
	} 

}

}

o ORM

public class OP implements Serializable {

@Id @GeneratedValue
private Integer idOP;

@Column(name = "numeroOP", nullable = true, length = 30)
private String numeroOP;


@OneToMany(mappedBy = "op", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, targetEntity=OPOperacao.class)
@JoinColumn(name="idOP")
@OrderBy(clause = "sequencia desc")
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
@OnDelete(action = OnDeleteAction.CASCADE)
private List<OPOperacao> operacoes = new ArrayList<OPOperacao>();

public Integer getIdOP() {
	return idOP;
}

public void setIdOP(Integer idOP) {
	this.idOP = idOP;
}


public String getNumeroOP() {
	return numeroOP;
}

public void setNumeroOP(String numeroOP) {
	this.numeroOP = numeroOP;
}



public List<OPOperacao> getOperacoes() {
	return operacoes;
}

public void setOperacoes(List<OPOperacao> operacoes) {
	this.operacoes = operacoes;
}

public void addOperacao(OPOperacao operacao) {
	if ( operacoes == null ) operacoes = new ArrayList<OPOperacao>();
	operacoes.add( operacao );
	operacao.setOp( this );
}

}

como você resolveu isso?

brigadu

Débora

vitenho

debora vc ja tem o session filter que abre e fecha a session do hibernate?

aqui tem como fazer isso:

http://guj.com.br/posts/list/15/133184.java

valeu

Criado 24 de março de 2008
Ultima resposta 30 de jul. de 2009
Respostas 4
Participantes 3