Relacionamento hibernate entre tabelas

5 respostas
Emillyewilliammorett

Bom Dia,
Tenho 2 tabelas Cliente e Atendimento.
O problema é que quando vou salvar um Atendimento da o seguinte erro…

jun 17, 2016 11:11:37 AM com.sun.faces.lifecycle.InvokeApplicationPhase execute

ADVERTÊNCIA: #{atendimentoBack.salvar}: java.lang.IllegalStateException: Transaction not active

javax.faces.FacesException: #{atendimentoBack.salvar}: java.lang.IllegalStateException: Transaction not active

at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)

at javax.faces.component.UICommand.broadcast(UICommand.java:315)

at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)

at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)

at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)

at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Unknown Source)

Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException: Transaction not active

at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)

at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)

 27 more

Caused by: java.lang.IllegalStateException: Transaction not active

at org.hibernate.ejb.TransactionImpl.rollback(TransactionImpl.java:101)

at Dao.CrudDAO.cadastrar(CrudDAO.java:24)

at Bo.CrudBO.cadastrar(CrudBO.java:10)

at Backbean.AtendimentoBack.salvar(AtendimentoBack.java:104)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at org.apache.el.parser.AstValue.invoke(AstValue.java:279)

at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)

at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)

at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)

 28 more

Meu Index onde é a tela do atendimento

<h2>Atendimento</h2>
          <h:form id ="atendimento">
         
         <p:commandButton value="Incluir" action="#{clienteBack.paginaClientes}" >
              
           </p:commandButton>
            <br /><br />
            <p:panelGrid columns="2">
                <h:outputText value="ID" />
                <h:outputText value="#{clienteBack.clienteSelecionado.id}" />

                <h:outputText value="Nome:" />
                <h:outputText value="#{clienteBack.clienteSelecionado.nome}" />

            </p:panelGrid>
         
         
    <h:panelGrid columns="2" cellpadding="5">
     
            <h:selectOneMenu  value="#{atendimentoBack.atendimento.tipoid}" >  
            <f:selectItem   itemLabel="Tipo de Atendimento"  />  
            <f:selectItems value="#{tipoBack.carregarSelect}" />  
        </h:selectOneMenu ><br/>
     
    
       
 
     
 </h:panelGrid>
    

       
            
          
            
 
 
    <p>Descrição do Atendimento</p>
    <p:inputTextarea rows="10" cols="90" value="#{atendimentoBack.atendimento.descricao}" queryDelay="750" minQueryLength="4" />
     <p:commandButton value="Salvar" action ="#{atendimentoBack.salvar}" 
	     update ="atendimento"/>
          </h:form>
         </ui:insert>
   
      <div class="wrapper">
      <h:form>

Minha classe ClienteEntity
@Entity
@Table(name = "CLIENTE")

public class ClienteEntity {
	
	@OneToMany(mappedBy = "cliente", targetEntity = AtendimentosEntity.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List<AtendimentosEntity> Atendimento;
	
	@Id
	@Column(name = "ID")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	@Column(name = "NOME")
	private String nome;

minha classe AtendimentoEntity
@Entity
@Table(name = "ATENDIMENTO")
public class AtendimentosEntity {
	
	
	
	@Id
	@Column(name = "ID")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	
	//descricao do atendimento
	@Column(name = "DESCRICAO")
	private String descricao;
	
	@OneToOne
	 @JoinColumn(name="CLIENTE_ID")
	 private ClienteEntity cliente;
	 public ClienteEntity getCliente() {
		return cliente;
	}

	public void setCliente(ClienteEntity cliente) {
		this.cliente = cliente;
	}

	public int getTipoid() {
		return tipoid;
	}

	public void setTipoid(int tipoid) {
		this.tipoid = tipoid;
	}

}

Minha classe AtendimentoBack
@ManagedBean(name = "atendimentoBack")
@ViewScoped
public class AtendimentoBack {
	
	private ClienteEntity cliente;
	public ClienteEntity getCliente() {
		return cliente;
	}

	public void setCliente(ClienteEntity cliente) {
		this.cliente = cliente;
	}

	private AtendimentosEntity atendimento;
	

	

	

	
	private List<AtendimentosEntity> atendimentos;
		
	

	public AtendimentosEntity getAtendimento() {
		return atendimento;
	}

	public void setAtendimento(AtendimentosEntity atendimento) {
		this.atendimento = atendimento;
	}

	public List<AtendimentosEntity> getAtendimentos() {
		return atendimentos;
	}

	public void setAtendimentos(List<AtendimentosEntity> atendimentos) {
		this.atendimentos = atendimentos;
	}

	@PostConstruct
	public void inicializar(){
		
		atendimento = new AtendimentosEntity();
		atendimentos = new AtendimentoBO().listarTodos(AtendimentosEntity.class);
		cliente = new ClienteEntity();
		
	}
	
	
	
	
	
	public String salvar(){
		if(atendimento.getId() != null){
			new AtendimentoBO().atualizar(atendimento);
			
			}else{
				
				atendimento.setCliente(cliente);	
		new AtendimentoBO().cadastrar(atendimento);
			
			}
		atendimento = new AtendimentosEntity();
		atendimentos = new AtendimentoBO().listarTodos(AtendimentosEntity.class);
		cliente = new ClienteEntity();
		
		return "/restrito/index.xhtml?faces-redirect=true";
			}
	
	
			
}

5 Respostas

igomes

Posta o BO

Emillyewilliammorett

Cara estava funcionando o salvar só quando coloquei pra relacionar as tablelas que deu esse erro.
Segue meu Bo
package Bo;

import Entity.ClienteEntity;

public class ClienteBO extends CrudBO {

}

e meu crudBO
package Bo;

import java.util.List;

import Dao.CrudDAO;

public class CrudBO {

public void cadastrar(E entidade){
	new CrudDAO<E>().cadastrar(entidade);
}
public void atualizar(E entidade){
	new CrudDAO<E>().atualizar(entidade);
}
public void remover(E entidade){
	new CrudDAO<E>().remover(entidade);
}

public E buscaPorId(Object id, Class clazz){
	return new CrudDAO<E>().buscarPorId(id, clazz);
}

public List<E> listarTodos(Class clazz){
	return new CrudDAO().listarTodos(clazz);
}

}

Emillyewilliammorett

Estou achando que o problema esta aqui
Cliente : <p:inputText size=“60” value="#{clienteBack.clienteSelecionado.nome}" /> pois aqui ele recupera o nome do cliente que vem de um clique no datatable. não sei dae como passar esse dado para o atendimentoBack para que quando clicar no salvar ele passe o id do cliente.

R

Olá, uma sugestão: verifique se o “cliente” que você está passando para o atendimento, possui um valor em seu id , em outras palavras, veja se ele está salvo no banco. Suspeito que no momento que você faz o comando “atendimento.setCliente(cliente);” este cliente não tenha um id e por isso provoque o erro ao salvar o atendimento. Pense que sempre para salvar uma “entidade pai” os filhos setados nele precisem ja estar salvos na base e ele precisa conhecer seu id…

Para corrigir, salve o cliente em banco e obtenha seu id.

Abs,
Ricardo.

Emillyewilliammorett

Ricardo…
O cliente ja esta salvo no banco de dados, como falei anteriormente, clico no datatable onde tem um cliente ja com seu id.

Criado 17 de junho de 2016
Ultima resposta 20 de jun. de 2016
Respostas 5
Participantes 3