[RESOLVIDO] Erro JPA OneToMAny. Dificuldade para salvar os dados no banco

Galera, por favor alguém pode me ajudar ?? Estou com um problema de relacionamento quando faço a inserção do objeto Entrada a JPA deveria guardar o valor do id_entrada na ForeingKey da tabela Equipamentos. Para que a tabela equipamentos saiba de qual entrada de nota ela veio.

Fiz uma relação OneToMany de Entrada para equipamentos e vice-versa com ManyToOne. Só que id não esta sendo salvo na tabela. ele cria a FK entrada_id na tabela equipamentos, mas não insere o id.

Entidade Entrada, abaixo:

@Entity
@Table(name = "entrada")
public class Entrada implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_entrada")
    private Long id;

    /**
     * Funcionando corretamente
     */
    @OneToOne(cascade = CascadeType.ALL)
    private Usuario usuario;
    
    
    @OneToMany(mappedBy = "entrada", cascade = CascadeType.ALL)
    private List<Equipamento> equipamentos;

    public List<Equipamento> getEquipamentos() {
        return equipamentos;
    }

    public void setEquipamentos(List<Equipamento> equipamentos) {
        this.equipamentos = equipamentos;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    
    private String nota;
    private String fornecedor;
    
    @Column(precision = 2, scale = 2)
    private Double custo;
    
    @Temporal(TemporalType.DATE)
    private Calendar data_da_compra;

    
    public String getNota() {
        return nota;
    }

    public void setNota(String nota) {
        this.nota = nota;
    }

    public String getFornecedor() {
        return fornecedor;
    }

    public void setFornecedor(String fornecedor) {
        this.fornecedor = fornecedor;
    }

    public Double getCusto() {
        return custo;
    }

    public void setCusto(Double custo) {
        this.custo = custo;
    }

    public Calendar getData_da_compra() {
        return data_da_compra;
    }

    public void setData_da_compra(Calendar data_da_compra) {
        this.data_da_compra = data_da_compra;
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Entrada)) {
            return false;
        }
        Entrada other = (Entrada) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.atacadao.entidades.Entrada[ id=" + id + " ]";
    }
    
}

Entidade Equipamento abaixo:

@Entity
@Table(name = "equipamentos")
public class Equipamento implements Serializable {

    private static final long serialVersionUID = 1L;
    

    @ManyToOne
    @JoinColumn(name = "entrada_id")
    private Entrada entrada;

    public Entrada getEntrada() {
        return entrada;
    }

    public void setEntrada(Entrada entrada) {
        this.entrada = entrada;
    }
   
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_equipamento")
    private Long id;
   
    private String nome;
    
    @Temporal(TemporalType.DATE)
    @Basic(optional = true)
    private Calendar validade;
    
    private String situacao;
    
    private String tipo;
   
    @Basic(optional = false)
    @Column(name = "valor", scale = 2, precision = 2,nullable = false,insertable = true, updatable = true)
    private Double valor;

    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Calendar getValidade() {
        return validade;
    }

    public void setValidade(Calendar validade) {
        this.validade = validade;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
   
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Equipamento)) {
            return false;
        }
        Equipamento other = (Equipamento) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.atacadao.entidades.Equipamento[ id=" + id + " ]";
    }
    
}

Entidade Usuario abaixo:

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

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    @Basic(optional = false)
    @Column(length = 45,insertable = true,nullable = false,updatable = true)
    private String nome;
    
    @Basic(optional = false)
    @Column(length = 120,insertable = true,nullable = false,updatable = true)
    private String sobrenome;
    
    @Basic(optional = false)
    @Column(length = 45,insertable = true,nullable = false,updatable = true)
    private String senha;
    
    @Basic(optional = false)
    @Column(length = 45,insertable = true,nullable = false,updatable = true)
    private String login;
    
    @Basic(optional = false)
    @Column(length = 45,insertable = true,nullable = false,updatable = true)
    private String niveis;
    
    @Basic(optional = false)
    @Column(length = 45,insertable = true,nullable = false,updatable = true)
    private String local;

   

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getNiveis() {
        return niveis;
    }

    public void setNiveis(String niveis) {
        this.niveis = niveis;
    }

    public String getLocal() {
        return local;
    }

    public void setLocal(String local) {
        this.local = local;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.atacadao.entidades.usuario[ id=" + id + " ]";
    }
    
}

Saida da execução do NetBeans abaixo:

run:
out 10, 2016 12:44:29 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
out 10, 2016 12:44:29 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
out 10, 2016 12:44:29 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
out 10, 2016 12:44:30 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: TestandoPU
    ...]
out 10, 2016 12:44:30 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.1.Final}
out 10, 2016 12:44:30 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
out 10, 2016 12:44:30 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
out 10, 2016 12:44:30 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.postgresql.Driver] at URL [jdbc:postgresql://localhost:5433/almoxarifado]
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=postgres, password=****}
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
out 10, 2016 12:44:30 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect
out 10, 2016 12:44:30 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
out 10, 2016 12:44:30 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000228: Running hbm2ddl schema update
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000102: Fetching database metadata
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000396: Updating schema
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: public.saida
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [datasol, id_equipamento, id_usuario, responsavel, id_saida, datalib]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: [chave estrangeira usuario, chave estrangira equipamentos]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [chave primaria saida]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: public.solicitacoes
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [datasol, id_usuario, id_solicitacao, nome, responsavel, datalib]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: []
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [solicitacoes_pkey]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: public.entrada
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [usuario_id, custo, data_da_compra, fornecedor, nota, id_entrada]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: [fk_jn6q94c02o0knmanhvnajuwrg]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [chave primaria entrada]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: public.equipamentos
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [situacao, tipo, id_equipamento, entrada_id, valor, nome, validade]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: [fk_a9p4bh11rejwqosdh31b0rv9e]
out 10, 2016 12:44:30 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [chave primaria equipamento]
out 10, 2016 12:44:31 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000261: Table found: public.usuarios
out 10, 2016 12:44:31 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000037: Columns: [senha, niveis, nome, id, sobrenome, login, local]
out 10, 2016 12:44:31 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000108: Foreign keys: []
out 10, 2016 12:44:31 PM org.hibernate.tool.hbm2ddl.TableMetadata <init>
INFO: HHH000126: Indexes: [usuarios_pkey]
out 10, 2016 12:44:31 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
INFO: HHH000232: Schema update complete
Hibernate: 
    select
        nextval ('hibernate_sequence')
Hibernate: 
    select
        nextval ('hibernate_sequence')
Hibernate: 
    select
        nextval ('hibernate_sequence')
Hibernate: 
    insert 
    into
        usuarios
        (local, login, niveis, nome, senha, sobrenome, id) 
    values
        (?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        entrada
        (custo, data_da_compra, fornecedor, nota, usuario_id, id_entrada) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        equipamentos
        (entrada_id, nome, situacao, tipo, validade, valor, id_equipamento) 
    values
        (?, ?, ?, ?, ?, ?, ?)
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

Saida do Banco Abaixo:

Estou precisando muito resolver isso. :fearful::fearful::fearful:
Desde já, muito grato a Todos :grin::grin::grin:

Primeiro, você só terá um Equipamento com referência à Entrada caso você tenha deixado essa referência explícita. Por exemplo, pense que você está cadastrando uma entrada com 10 equipamentos, se não adicionar a instância de Entrada em cada uma das instâncias de Equipamento e vice-versa, o JPA não vai alterar nada em Equipamento.

1 curtida

Muito Obrigado, pela resposta …

O meu método principal estava dessa forma abaixo esqueci de adicionar as instâncias de entrada em equipamento.

Metodo ANTIGO
public class NovoMain {

    public static void main(String[] args) {
        
        
        Usuario usuario = new Usuario();
        usuario.setLocal("local");
        usuario.setLogin("login");
        usuario.setNiveis("niveis");
        usuario.setNome("nomes");
        usuario.setSenha("senha");
        usuario.setSobrenome("sobrenome");
        
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();

        ArrayList<Equipamento> equipamentos = new ArrayList<>();
        
        Equipamento equipamento = new Equipamento();
        equipamento.setNome("relacao7");
        equipamento.setSituacao("boa");
        equipamento.setTipo("legal");
        equipamento.setValidade(calendar);
        equipamento.setValor(Double.valueOf("123"));
        
        equipamentos.add(equipamento);
        equipamentos.add(equipamento);
        equipamentos.add(equipamento);
        
        Entrada entrada = new Entrada();
        entrada.setCusto(Double.valueOf("100"));
        entrada.setData_da_compra(calendar);
        entrada.setFornecedor("fornecedor");
        entrada.setUsuario(usuario);
        entrada.setEquipamentos(equipamentos);
        
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("TestandoPU");        
        EntityManager  entityManager = entityManagerFactory.createEntityManager();
        
        
        entityManager.getTransaction().begin();
        entityManager.persist(entrada);
        entityManager.getTransaction().commit();
        entityManager.close();
        System.exit(0);
    }
    
}

METODO CORRIGIDO

public class NovoMain {

    public static void main(String[] args) {
        
        
        Usuario usuario = new Usuario();
        usuario.setLocal("local");
        usuario.setLogin("login");
        usuario.setNiveis("niveis");
        usuario.setNome("nomes");
        usuario.setSenha("senha");
        usuario.setSobrenome("sobrenome");
        
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();

        ArrayList<Equipamento> equipamentos = new ArrayList<>();
        
        Equipamento equipamento = new Equipamento();
        equipamento.setNome("relacao7");
        equipamento.setSituacao("boa");
        equipamento.setTipo("legal");
        equipamento.setValidade(calendar);
        equipamento.setValor(Double.valueOf("123"));
        
        Entrada entrada = new Entrada();
        entrada.setCusto(Double.valueOf("100"));
        entrada.setData_da_compra(calendar);
        entrada.setFornecedor("fornecedor");
        entrada.setUsuario(usuario);
        entrada.setEquipamentos(equipamentos);
        
        **equipamento.setEntrada(entrada);**
        
        equipamentos.add(equipamento);
        equipamentos.add(equipamento);
        equipamentos.add(equipamento);
        
        
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("TestandoPU");        
        EntityManager  entityManager = entityManagerFactory.createEntityManager();
        
        
        entityManager.getTransaction().begin();
        entityManager.persist(entrada);
        entityManager.getTransaction().commit();
        entityManager.close();
        System.exit(0);
    }
    
}

Mais uma vez, muito Obrigado !!!