Como vincular um dado de FK em classe

7 respostas
W

Olá amigos !

Estou desenvolvendo um sistema e acredito estar realizando algum procedimento incorreto para o erro que está sendo apresentado pelo NetBeans.

Tenho as seguintes classes UsuárioSistema e Perfil. A primeira classe representa o usuário que irá logar no sistema. A classe perfil representa o tipo de usuário que irá acessar o sistema (usuário comum ou administrador). O problema ocorre na inserção de dados na classe que recebe uma chave estrangeira através da classe principal. Como devo proceder para passar esse valor, ou seja, que tipo de método deve ser criado ? Segue abaixo também a classe principal e o erro que está ocorrendo. Desde já muito obrigado !

package businessObjects;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="tab_usuariosistema")
public class UsuarioSistema implements Serializable {
    
    //Anotações da Classe
    
    @Id
    @GeneratedValue
    @Column(name="idUsuarioSistema", nullable=false, unique=true)
    private Integer idUsuarioSistema;
    
    @Column(name="nomeusuarioUsuarioSistema", nullable=false, length=50, unique=true)
    private String nomeusuarioUsuarioSistema;
    
    @Column(name="senhausuarioUsuarioSistema", nullable=false, length=100)
    private String senhausuarioUsuarioSistema;
    
    //Relacionamento com a Classe Perfil
    
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idPerfil", referencedColumnName="idPerfil", nullable=false)
    private Perfil perfil;

    // Getters e Setters da Classe

    public Integer getIdUsuarioSistema() {
        return idUsuarioSistema;
    }

    public void setIdUsuarioSistema(Integer idUsuarioSistema) {
        this.idUsuarioSistema = idUsuarioSistema;
    }

    public String getNomeusuarioUsuarioSistema() {
        return nomeusuarioUsuarioSistema;
    }

    public void setNomeusuarioUsuarioSistema(String nomeusuarioUsuarioSistema) {
        this.nomeusuarioUsuarioSistema = nomeusuarioUsuarioSistema;
    }

    public String getSenhausuarioUsuarioSistema() {
        return senhausuarioUsuarioSistema;
    }

    public void setSenhausuarioUsuarioSistema(String senhausuarioUsuarioSistema) {
        this.senhausuarioUsuarioSistema = senhausuarioUsuarioSistema;
    }
    
   
    }
package businessObjects;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="tab_perfil")
public class Perfil implements Serializable {
    
    //Anotações da Classe
    
    @Id
    @GeneratedValue
    @Column(name="idPerfil", nullable=false, unique=true)
    private Integer idPerfil;
    
    @Column(name="nomePerfil", nullable=false, length=50, unique=true)
    private String nomePerfil;
    
    //Relacionamento com a Classe UsuarioSistema
    
    @OneToMany(mappedBy="perfil")
    private List <UsuarioSistema> usuariosistema;
    
    //Setters e Getters da Classe

    public Integer getIdPerfil() {
        return idPerfil;
    }

    public void setIdPerfil(Integer idPerfil) {
        this.idPerfil = idPerfil;
    }

    public String getNomePerfil() {
        return nomePerfil;
    }

    public void setNomePerfil(String nomePerfil) {
        this.nomePerfil = nomePerfil;
    }

    public List<UsuarioSistema> getUsuariosistema() {
        return usuariosistema;
    }

    public void setUsuariosistema(List<UsuarioSistema> usuariosistema) {
        this.usuariosistema = usuariosistema;
    }

Classe principal

package businessObjects;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class Teste {

    public static void main(String[] args) {
        
        Configuration cfg = new AnnotationConfiguration();
        cfg.configure("/conf/hibernate.cfg.xml");
        SessionFactory sf = cfg.buildSessionFactory();
        
        Session session = sf.openSession();
        org.hibernate.Transaction tx = session.beginTransaction();
        
        UsuarioSistema usuario = new UsuarioSistema();
        usuario.setIdUsuarioSistema(1);
        usuario.setNomeusuarioUsuarioSistema("willyan");
        usuario.setSenhausuarioUsuarioSistema("a1b2c3d4");
              
        session.save(usuario);
        tx.commit();
        session.close();
    }
}

Erro:

Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: businessObjects.UsuarioSistema.

7 Respostas

Hebert_Coelho

Não sei se esse é o erro mas altere isso aqui.

@Id  
@GeneratedValue  
@Column(name="idPerfil", nullable=false, unique=true)  
private Integer idPerfil;


@ManyToOne(fetch=FetchType.LAZY)  
@JoinColumn(name="idPerfil", referencedColumnName="idPerfil", nullable=false)  
private Perfil perfil;

Retire o nullable de ambos.

Não faça o comando abaixo:
usuario.setIdUsuarioSistema(1);
W

Quando tiro a propriedade “nullable=false” gera o erro que fere a integridade do banco MySQLIntegrityConstraintViolationException.

Será que o correto seria criar métodos Setter e Getter para o atributo que perfil mapeado pela classe UsuarioSistema ?

@ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="idPerfil", referencedColumnName="idPerfil", nullable=false) private Perfil perfil;

Hebert_Coelho

Você deu drop nas tabelas para criar tudo novamente? Talvez a chave ainda esteja lá.

Talvez na Classe Perfil ainda esteja Nullable.

Ou vc cria o perfil junto com o usuário ou então ranca de lá.

W

Amigo jakefrog,

Inseriu!!!
Agora a minha dúvida é: Qual método vou criar para referenciar a qual “idPerfil” esse usuário que foi criado pertence ?

Hebert_Coelho

Uai, faz um usuario.setPerfil e perfil.setUsuario.

Dá uma olhada aqui, talvez te ajude. @OneToMany e @ManyToOne Unidirecional e Bidirecional

W

Amigo,
Irei ler seu artigo e lhe respondo amanhã sobre o resultado (entendimento). Obrigado !

:slight_smile:

W

jakefrog,
Desculpe a demora em lhe responder.
Como a classe principal era como teste e na verdade eu passaria o objeto de Perfil populado em um ComboBox numa janela, consegui realizar o procedimento com o código abaixo:

private void btnsalvarusuarioActionPerformed(java.awt.event.ActionEvent evt) {                                                 
                     
            TabUsuariosistema usuarioSistema = new TabUsuariosistema();
                      
            usuarioSistema.setNomeusuarioUsuarioSistema(txtnomeusuario.getText());
            usuarioSistema.setSenhausuarioUsuarioSistema(txtsenhanomeusuario.getText());
            usuarioSistema.setTabPerfil((TabPerfil)cbbperfilusuario.getSelectedItem());
            
            DAO objetoUsuario = new DAO(usuarioSistema);              
            objetoUsuario.inserir();
            
            limparDados();
            preencherTabela();

    }
Esta é a linha que passo o objeto TabPerfil, que representa a mesma.
usuarioSistema.setTabPerfil((TabPerfil)cbbperfilusuario.getSelectedItem());

Abraços

Criado 1 de novembro de 2011
Ultima resposta 18 de nov. de 2011
Respostas 7
Participantes 2