[RESOLVIDO] Problemas ao tentar Persistir chave estrangeira - Java

8 respostas Resolvido
jsfjavahibernate
F

Boa tarde a todos,

Estou enviando está solicitação de ajuda ao grupo de colegas desenvolvedores.
Em minha primeira mensagem creio que deixei a desejar nos dados para analise. Então obrigado pela paciência de todos e hoje tentarei postar mais uma vez o assunto de maneira que possa ser compreendida.

Sou iniciante em Java Web, estou estudando muito essa linguagem e conto com a solicitude de todos pois sei que assim como eu somos eternos aprendizes.

Sem mais delongas…

Minha dificuldade: Gravar o código da empresa que está na tabela do usuário na tabela do contaCorrente no campo codemp(chave estrangeira).

Tenho o seguinte cenário:

  • Classe empresa; (Classe principal de todas notação OneToMany para as demais tabelas)
  • Classe usuario; (Classe com vinculo a classe empresa ManyToOne)
  • Classe contaCorrente; (Classe com vinculo a classe empresa ManyToOne)

O que estou utilizando:

  • eclipse Neon;
  • java 8;
  • tomcat;
  • hibernate (com uso do Session)
  • MySql

O cenário está projetado para seguir a lógica:

Empresa tem vários funcionários ; (relacionamento OneToMany)
Empresa tem várias contasCorrentes(bancárias); (relacionamento OneToMany)

As contas correntes cadastradas devem estar ligadas a empresa e não ao usuário. Porém quem cadastra a contaCorrente é o usuário.

O usuário quando é cadastrado tem relacionamento com a empresa.

E eu não estou conseguindo fazer com que o codigo da empresa persista na tabela da contaCorrente.

Informações complementares:
Estou utilizando o SpringSecurity para o controle de acesso por usuario o controle é por login.

Classe empresa

@Entity
@Table(name="e000emp")
public class Empresa implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 6027770984914382242L;
	
	@Id
	@GeneratedValue
	private Integer codemp;	// codigo da empresa
	private String  nomemp; // nome da empresa
	private Integer qtdusu; // quantidade de usuarios do sistema desta empresa
	private String  sitemp; // status de situação da empresa (ativo / inativo)
	@OneToMany(mappedBy="empresa")
	private List<Usuario> usuarios = new ArrayList<Usuario>(); 
	
	@OneToMany(mappedBy="empresa")
	private List<ContaMovimento> contaMovto = new ArrayList<ContaMovimento>();
        
       //getters e setters

}

Classe usuario

@Entity
@Table(name="usuario")
public class Usuario implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5349608664211158549L;
	
	@Id
	@GeneratedValue
	private Integer codigo;
	private String nome;
	private String email;
	@org.hibernate.annotations.NaturalId
	private String login;
	private String senha;
	private Date nascimento;
	private String cpfcnp;
	private String celular;
	private String idioma;
	private boolean ativo;
	@ManyToOne
	@JoinColumn(name="codemp", referencedColumnName = "codemp", foreignKey = @ForeignKey(name="fk_usuario_e000emp"))
	private Empresa empresa;
	
	@ElementCollection(targetClass = String.class)
	@JoinTable(
			name = "usuario_permissao",
			uniqueConstraints = {@UniqueConstraint(columnNames = {"usuario","permissao"})},
			joinColumns = @JoinColumn(name="usuario"))
	@Column(name = "permissao", length=50)
	private Set<String> permissao = new HashSet<String>();
       
        //getters e setters
}

Classe contaMovimento

@Entity
@Table(name="e000ctf") 
public class ContaMovimento implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7635108147549791472L;

	@Id @GeneratedValue
	@Column(name="codctf")
	private Integer codContaMovto;
	@Column(name="desctf")
	private String nomeContaMovto;
	@Column(name="codbco")					//codigo do banco
	private Integer numBanco;
	@Column(name="nombco")					//nome do banco
	private String nomeBanco;
	@Column(name="numage")					//numero da agencia
	private String numAgencia;
	@Column(name="numctb")					//numero da conta bancaria
	private String numContaBanco;
	@Column(name="dtaabc")					//data de abertura da conta no banco
	private Date dataAbertaConta;
	@Column(name="dtadsd")					//data de definição do saldo inicial da conta para movimento no sistema
	private Date dataSaldoInicial;
	@Column(name="vlrsdi")					//valor do saldo inicial
	private float saldoInicial;
	@Column(name="dtacad", nullable=false, updatable=false)					//data do cadastro no sistema
	private Date dataCadastro;
	@ManyToOne
	@JoinColumn(name="codemp", referencedColumnName="codemp", foreignKey= @ForeignKey(name="fk_e000ctf_e000emp"))
	private Empresa empresa;
	public Integer getCodContaMovto() {
		return codContaMovto;
	}
        //getters e setters
}

Como dito anteriormente é que não consigo fazer a inclusão no banco com a campo codemp = ao código da empresa que está no usuario logado.

Já fiz tentei fazer de varias maneiras e não consigo.

comando salvar - xhtml

<p:panelGrid  id="btn" columns="1" columnClasses="ui-grid-col-1" layout="grid" styleClass="ui-panelgrid-blank">
    	  <p:commandButton action="#{contaMovimentoBean.salvar}" value="Salvar"/>							
    </p:panelGrid>

clase contaMovimentoBean

@ManagedBean
@RequestScoped
public class ContaMovimentoBean {
	
	private ContaMovimento selecionada = new ContaMovimento();
	private List<ContaMovimento> lista = null;

	
	public String salvar(){
		ContaMovimentoRN contaMovimentoRN = new ContaMovimentoRN();
		contaMovimentoRN.salvar(this.selecionada);
		return "/restrito/dashboard";
	}

}

clase contaMovimentoRN classe de regra

public class ContaMovimentoRN {

	private ContaMovimentoDAO contaMovimentoDAO;
	
	
	public ContaMovimentoRN(){
		this.contaMovimentoDAO = DAOFactory.criarContaMovimentoDAO();
	}
	
	public List<ContaMovimento> listar(Empresa empresa){
		return this.contaMovimentoDAO.listar(empresa);
	}
	
	public ContaMovimento carregar(Integer ctaMovto){
		return this.contaMovimentoDAO.carregar(ctaMovto);
	}
	
	public void salvar(ContaMovimento ctaMovto){
		ctaMovto.setDataCadastro(new Date());
		this.contaMovimentoDAO.salvar(ctaMovto);
	}
}

classe contaMovimentoDAo

public class ContaMovimentoDAOHibernate implements ContaMovimentoDAO {

	private Session session;
	public void setSession (Session session){
		this.session = session;
	}
	
	@Override
	public void salvar(ContaMovimento ctaMovto) {
		this.session.saveOrUpdate(ctaMovto);
	}
}

E tenho uma classe de contextoBean para fazer busca do usuario logado no sistema conforme pode ser observado na imagem enviada no rodapé. Mais não conseguir identificar um conjectura disto para adicionar a chamada do codigo da empresa.

classe contextoBean

@ManagedBean
@SessionScoped
public class ContextoBean implements Serializable{

	
	/**
	 * 
	 */
	private static final long serialVersionUID = -3063140627158089130L;
	private int codigoContaAtiva = 0;
	private Empresa empresaLogada = null;
	

	
	/*getUsuarioLogado: Obtem o login do usuário 
	 * */
	public Usuario getUsuarioLogado(){
		
		FacesContext context = FacesContext.getCurrentInstance();
		ExternalContext external = context.getExternalContext();
		
		String login = external.getRemoteUser(); 								// executa a carga desse usuario usando o método da classe UsuarioRN 
		
		if(login != null){
			UsuarioRN usuarioRN = new UsuarioRN();
			return usuarioRN.buscarPorLogin(login);
		}
		return null;
	}
}	``` 

No mais é isso pessoal, quem puder ajudar ficarei muito agradecido.

Grande abraço a todos

8 Respostas

R

Antes de tudo quero lhe parabenizar pela organização e preocupação de deixar tudo claro no post… top brow!!
Estava olhando ó código e não consegui enxergar onde você setou a empresa a conta. Acredito que você usaria naquela classe ContaMovimentoRN e nela chamaria o getUsuarioLogado() p/ assim atribuir os valores que deseja.

F

Eu que devo agradecer a sua atenção.

E obrigado pela sugestão proposta.

Esse procedimento já havia tentando, porém sem sucesso. Pois o retorno não é o que a classe solicita. Então talvez o meu problema seja no ContextoBean.

R

Ótimo mas o metodo getUsuarioLogado() retornar uma instancia de Usuario. Então ficaria assim :

ctaMovto.setEmpresa(this.contextoBean.getUsuarioLogado().getEmpresa());

EDIT: Apesar do Clean Code nos sugerir outra coisa, só pra esclarecer você pode encadear quantos metodos quiser se os mesmos forem acessíveis.

G
Solucao aceita

Acho q tb está faltando o método setter do managed property contextoBean, que é necessário para a injeção de dependência… só o setter, sem o getter…

F

Oi Raul,

Obrigado, entendi e apliquei de fato foi encadeado. (valeu).

Após ajustar processar a operação foi apresentado erro conforme imagem abaixo:

nao consegui decifrar,

será que você teria outra dica?

obrigado,

R

Pode ser 2 coisas vc terá que debugar:
1 - this.contextoBean está null.
2 - this.contextoBean.getUsuarioLogado() está retornando null.

Depois que verificar isto já veja se o this.contextoBean.getUsuarioLogado().getEmpresa() não está null tbm.

F

Valeu Irmão,

Obrigadão pela força.

O problema estava na declaração:
1 - Não estava setando o setEmpresa na classe ContaMovimentoBean;
2 - Não tinha gerado os getters/setters do instanciamento da classe ContextoBean.

Ficando assim o código.

Obrigadão mesmo pela força,

Deus abençõe,

F

Olá guikkaroto,

Não havia visto o seu post.

Obrigado pela força,

Deus abençoe,

Valeu

Criado 13 de janeiro de 2017
Ultima resposta 13 de jan. de 2017
Respostas 8
Participantes 3