[RESOLVIDO]ManyToOne - chave estrangeira nao persiste

Bom pessoal,

Estou a pouco tempo desenvolvendo em java e confesso que é uma linguagem que é fascinante mais difícil de entender e que em alguns casos dá nó na cabeça.

Procurei muito aqui por assunto semelhante ao meu mais de todos que li mesmo assim só fiquei mais confuso.

Meu caso:

  • Mapeamento ManyToOne a chave estrangeira na grava da tabela filha.

Tenho a classe Empresa (onde uma empresa pode ter varios usuarios)
Tenho a clase Usuario (onde vários usuarios pode estar relacionado a uma empresa);

/****/
package br.com.fransys.erp.empresa;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

import br.com.fransys.erp.usuario.Usuario;

@Entity
public class Empresa {
	@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(cascade={CascadeType.PERSIST}, mappedBy = "empresa" )
	private List<Usuario> usuarios = new ArrayList<Usuario>();
	
	public List<Usuario> getUsuarios() {
		return usuarios;
	}
	
	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	
	
	public Integer getCodemp() {
		return codemp;
	}
	public void setCodemp(Integer codemp) {
		this.codemp = codemp;
	}
	public String getNomemp() {
		return nomemp;
	}
	public void setNomemp(String nomemp) {
		this.nomemp = nomemp;
	}
	public Integer getQtdusu() {
		return qtdusu;
	}
	public void setQtdusu(Integer qtdusu) {
		this.qtdusu = qtdusu;
	}
	public String getSitemp() {
		return sitemp;
	}
	public void setSitemp(String sitemp) {
		this.sitemp = sitemp;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((codemp == null) ? 0 : codemp.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Empresa other = (Empresa) obj;
		if (codemp == null) {
			if (other.codemp != null)
				return false;
		} else if (!codemp.equals(other.codemp))
			return false;
		return true;
	}
	
}


Classe Usuario

package br.com.fransys.erp.usuario;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;



import br.com.fransys.erp.empresa.Empresa;

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

	@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(cascade = CascadeType.PERSIST, optional = false, fetch = FetchType.EAGER)
	@JoinColumn(name="codemp", nullable = false, referencedColumnName = "codemp", foreignKey = @ForeignKey(name = "fk_usuario_empresa"))
	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>();
	
	
	
	public Empresa getEmpresa() {
		return empresa;
	}
	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}
	public Integer getCodigo() {
		return codigo;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getCpfcnp() {
		return cpfcnp;
	}
	public void setCpfcnp(String cpfcnp) {
		this.cpfcnp = cpfcnp;
	}
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
	public String getSenha() {
		return senha;
	}
	public void setSenha(String senha) {
		this.senha = senha;
	}
	public Date getNascimento() {
		return nascimento;
	}
	public void setNascimento(Date nascimento) {
		this.nascimento = nascimento;
	}
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	public String getIdioma() {
		return idioma;
	}
	public void setIdioma(String idioma) {
		this.idioma = idioma;
	}
	public boolean isAtivo() {
		return ativo;
	}
	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}
	public Set<String> getPermissao() {
		return permissao;
	}
	public void setPermissao(Set<String> permissao) {
		this.permissao = permissao;
	}


Metodo Salvar UsuarioBean

	public String salvar(){
	/*	
		this.destinoSalvar = "usuariosucesso";
		this.usuario = new Usuario();
		this.usuario.setAtivo(true);
	*/	
		this.destinoSalvar = "usuariosucesso";
		this.usuario.setAtivo(true);
		this.usuario.setEmpresa(empresa);
		
		FacesContext context = FacesContext.getCurrentInstance();
		
		String senha = this.usuario.getSenha();
		if(!senha.equals(this.confirmarSenha)){
			FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente!");
			context.addMessage(null, facesMessage);
			return null;
		}
		
		UsuarioRN usuarioRN = new UsuarioRN();
		
		usuarioRN.salvar(this.usuario);
		
		return this.destinoSalvar;
	}

Pelo que entendi, você quer persistir os dois objetos juntos. Passa o código de quando você faz o persist.

Explica um pouco mais da ideia geral, se você realmente quer persistir os dois objetos juntos explica como você atribui valor aos atributos dessas das classes Empresa e Usuário. Se é um projeto web ou desktop explana um pouco mais, como o Trickstival já havia pedido ehehehehhe…

Bom dia Gabriel e trickstival

Muito solicito.

Obrigado pela atenção.

Eu estava com esse problema sim. Acabei encontrando uma solução.

Desculpas por não ter se expressado melhor, nas proximas tentarei dar mais detalhes.

obrigado,

1 curtida