[RESOLVIDO]Inserir dados no banco usando Hibernate

11 respostas
Jackye

Olá!

Estou com dificuldades em testar a inserção de dados no banco.
Tenho uma SuperClasse chamada ItemBilioteca e subclasses, como exemplo, Livro.
A classe ItemBiblioteca pega o código da classe Editora e da Classe Secao. Com isso como faço para testar o cadastro de livro?

O código que usei foi:

public class TesteCadastro {
    
       public static void main(String[] args) {
        
       LivroDAO livroDAO = new LivroDAO();
       Livro l = new Livro(); 
       
       l.setCodItemBiblioteca(1);
       l.getCodEditora(1);
       l.getCodSecao(1);
       l.setTitulo("Linguagem Java");
       l.setNuReferencia(234512);
       l.setEdicao(2);
       l.setAnoEdicao(2009);
       l.setNumeroExemplar(8);
       l.setVolume(3);
       l.setIsbn[telefone removido]);
       l.setDataCadastro(new Date());
       
       livroDAO.salvar(l);
       }
Mas dá erro na linha:
l.getCodEditora(1);
       l.getCodSecao(1);
o Erro diz que é preciso criar metodo na classe Livro!! Porém, já fiz a herança de ItemBiblioteca com Livro, então na hora de cadastrar a classe Livro deverei receber o mesmo da superclasse. E já fiz o relacionamento entre a classe ItemBiblioteca e as classes secao e editora. Com annotations do Hibernate.

E aí? Qual o código que devo usar pra testar a inserção de dados?

11 Respostas

Hebert_Coelho

Tem como você colocar o erro aqui?

Jackye

Nas linhas a seguir:

l.getCodEditora(1); l.getCodSecao(1);
Mostra o seguinte erro para os dois gets:
[color=olive]method getCodEditora in class br.com.Dominio.ItemBiblioteca cannot be applied to given types;
required: no arguments
found: int
reason: actual and formal argument lists differ in length[/color]

romarcio

Na classe Livro a variavel codEditora e codSessao são do tipo int ou do tipo Editora e Sessao?

Hebert_Coelho

A mensagem de erro diz que vc está chamando um método de modo errado.
Note que vc está passando um parâmetro, mas esse método espera parâmetros?

Jackye

Olá,

Há um relacionamento em questão.
Veja os códigos das classes:

CLASSE ItemBiblioteca:

package br.com.Dominio;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@Table(name = "ItemBiblioteca", catalog = "dbControleBibliotecario", schema = "dbo")
@Inheritance(strategy= InheritanceType.JOINED)
@XmlRootElement

public class ItemBiblioteca implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @Basic(optional = false)
    @Column(name = "CodItemBiblioteca", nullable = false)
    private Integer codItemBiblioteca;
    @Basic(optional = false)
    @Column(name = "Titulo", nullable = false, length = 150)
    private String titulo;
    @Basic(optional = false)
    @Column(name = "NuReferencia", nullable = false)
    private int nuReferencia;
    @Basic(optional = false)
    @Column(name = "Edicao", nullable = false)
    private int edicao;
    @Basic(optional = false)
    @Column(name = "AnoEdicao", nullable = false)
    private int anoEdicao;
    @Basic(optional = false)
    @Column(name = "NumeroExemplar", nullable = false)
    private int numeroExemplar;
    @Column(name = "Observacao", length = 255)
    private String observacao;
    @Basic(optional = false)
    @Column(name = "DataCadastro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    
    @ManyToMany(mappedBy = "itemBibliotecaCollection")
    private Collection<Autor> autorCollection;
    @JoinColumn(name = "CodSecao", referencedColumnName = "CodSecao", nullable = false)
    @ManyToOne(optional = false)
    private Secao codSecao;
    @JoinColumn(name = "CodEditora", referencedColumnName = "CodEditora", nullable = false)
    @ManyToOne(optional = false)
    private Editora codEditora;

    public ItemBiblioteca() {
    }

    public ItemBiblioteca(Integer codItemBiblioteca) {
        this.codItemBiblioteca = codItemBiblioteca;
    }

    public ItemBiblioteca(Integer codItemBiblioteca, String titulo, int nuReferencia, int edicao, int anoEdicao, int numeroExemplar, Date dataCadastro) {
        this.codItemBiblioteca = codItemBiblioteca;
        this.titulo = titulo;
        this.nuReferencia = nuReferencia;
        this.edicao = edicao;
        this.anoEdicao = anoEdicao;
        this.numeroExemplar = numeroExemplar;
        this.dataCadastro = dataCadastro;
    }

    public Integer getCodItemBiblioteca() {
        return codItemBiblioteca;
    }

    public void setCodItemBiblioteca(Integer codItemBiblioteca) {
        this.codItemBiblioteca = codItemBiblioteca;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public int getNuReferencia() {
        return nuReferencia;
    }

    public void setNuReferencia(int nuReferencia) {
        this.nuReferencia = nuReferencia;
    }

    public int getEdicao() {
        return edicao;
    }

    public void setEdicao(int edicao) {
        this.edicao = edicao;
    }

    public int getAnoEdicao() {
        return anoEdicao;
    }

    public void setAnoEdicao(int anoEdicao) {
        this.anoEdicao = anoEdicao;
    }

    public int getNumeroExemplar() {
        return numeroExemplar;
    }

    public void setNumeroExemplar(int numeroExemplar) {
        this.numeroExemplar = numeroExemplar;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    @XmlTransient
    public Collection<Autor> getAutorCollection() {
        return autorCollection;
    }

    public void setAutorCollection(Collection<Autor> autorCollection) {
        this.autorCollection = autorCollection;
    }

    public Secao getCodSecao() {
        return codSecao;
    }

    public void setCodSecao(Secao codSecao) {
        this.codSecao = codSecao;
    }

    public Editora getCodEditora() {
        return codEditora;
    }

    public void setCodEditora(Editora codEditora) {
        this.codEditora = codEditora;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codItemBiblioteca != null ? codItemBiblioteca.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 ItemBiblioteca)) {
            return false;
        }
        ItemBiblioteca other = (ItemBiblioteca) object;
        if ((this.codItemBiblioteca == null && other.codItemBiblioteca != null) || (this.codItemBiblioteca != null && !this.codItemBiblioteca.equals(other.codItemBiblioteca))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.Dominio.ItemBiblioteca[ codItemBiblioteca=" + codItemBiblioteca + " ]";
    }
    
}
CLASSE Livro:
package br.com.Dominio;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

@Entity
@PrimaryKeyJoinColumn(name="CodLivro")
@Table(name = "Livro", catalog = "dbControleBibliotecario", schema = "dbo")
public class Livro extends ItemBiblioteca implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    @Basic(optional = false)
    @Column(name = "Volume", nullable = false)
    private int volume;
    @Basic(optional = false)
    @Column(name = "ISBN", nullable = false)
    private int isbn;

    public Livro() {
    }

    public int getVolume() {
        return volume;
    }

    public void setVolume(int volume) {
        this.volume = volume;
    }

    public int getIsbn() {
        return isbn;
    }

    public void setIsbn(int isbn) {
        this.isbn = isbn;
    }
    
    @Override
    public String toString() {
        return "br.com.Dominio.Livro[ codLivro=" + getCodItemBiblioteca() + " ]";
    }    
}
CLASSE Secao:
package br.com.Dominio;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@Table(name = "Secao", catalog = "dbControleBibliotecario", schema = "dbo")

public class Secao implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @Basic(optional = false)
    @Column(name = "CodSecao", nullable = false)
    private Integer codSecao;
    @Basic(optional = false)
    @Column(name = "NomeSecao", nullable = false, length = 100)
    private String nomeSecao;
    @Basic(optional = false)
    @Column(name = "DataCadastro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codSecao")
    private Collection<ItemBiblioteca> itemBibliotecaCollection;

    public Secao() {
    }

    public Secao(Integer codSecao) {
        this.codSecao = codSecao;
    }

    public Secao(Integer codSecao, String nomeSecao, Date dataCadastro) {
        this.codSecao = codSecao;
        this.nomeSecao = nomeSecao;
        this.dataCadastro = dataCadastro;
    }

    public Integer getCodSecao() {
        return codSecao;
    }

    public void setCodSecao(Integer codSecao) {
        this.codSecao = codSecao;
    }

    public String getNomeSecao() {
        return nomeSecao;
    }

    public void setNomeSecao(String nomeSecao) {
        this.nomeSecao = nomeSecao;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    @XmlTransient
    public Collection<ItemBiblioteca> getItemBibliotecaCollection() {
        return itemBibliotecaCollection;
    }

    public void setItemBibliotecaCollection(Collection<ItemBiblioteca> itemBibliotecaCollection) {
        this.itemBibliotecaCollection = itemBibliotecaCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codSecao != null ? codSecao.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 Secao)) {
            return false;
        }
        Secao other = (Secao) object;
        if ((this.codSecao == null && other.codSecao != null) || (this.codSecao != null && !this.codSecao.equals(other.codSecao))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.Dominio.Secao[ codSecao=" + codSecao + " ]";
    }
    
}
CLASSE Editora:
package br.com.Dominio;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "Editora", catalog = "dbControleBibliotecario", schema = "dbo")

public class Editora implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "CodEditora", nullable = false)
    private Integer codEditora;
    @Basic(optional = false)
    @Column(name = "NomeEditora", nullable = false, length = 255)
    private String nomeEditora;
    @Basic(optional = false)
    @Column(name = "Logradouro", nullable = false, length = 255)
    private String logradouro;
    @Basic(optional = false)
    @Column(name = "Bairro", nullable = false, length = 45)
    private String bairro;
    @Basic(optional = false)
    @Column(name = "Cidade", nullable = false, length = 45)
    private String cidade;
    @Basic(optional = false)
    @Column(name = "Cep", nullable = false)
    private int cep;
    @Basic(optional = false)
    @Column(name = "UF", nullable = false, length = 2)
    private String uf;
    @Column(name = "Telefone", length = 13)
    private String telefone;
    @Column(name = "Email", length = 45)
    private String email;
    @Column(name = "Fax", length = 15)
    private String fax;
    @Column(name = "LinkSite", length = 45)
    private String linkSite;
    @Basic(optional = false)
    @Column(name = "DataCadastro", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataCadastro;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "codEditora", fetch= FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private Collection<ItemBiblioteca> itemBibliotecaCollection;

    public Editora() {
    }

    public Editora(Integer codEditora) {
        this.codEditora = codEditora;
    }

    public Editora(Integer codEditora, String nomeEditora, String logradouro, String bairro, String cidade, int cep, String uf, Date dataCadastro) {
        this.codEditora = codEditora;
        this.nomeEditora = nomeEditora;
        this.logradouro = logradouro;
        this.bairro = bairro;
        this.cidade = cidade;
        this.cep = cep;
        this.uf = uf;
        this.dataCadastro = dataCadastro;
    }

    public Integer getCodEditora() {
        return codEditora;
    }

    public void setCodEditora(Integer codEditora) {
        this.codEditora = codEditora;
    }

    public String getNomeEditora() {
        return nomeEditora;
    }

    public void setNomeEditora(String nomeEditora) {
        this.nomeEditora = nomeEditora;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public int getCep() {
        return cep;
    }

    public void setCep(int cep) {
        this.cep = cep;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getFax() {
        return fax;
    }

    public void setFax(String fax) {
        this.fax = fax;
    }

    public String getLinkSite() {
        return linkSite;
    }

    public void setLinkSite(String linkSite) {
        this.linkSite = linkSite;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    @XmlTransient
    public Collection<ItemBiblioteca> getItemBibliotecaCollection() {
        return itemBibliotecaCollection;
    }

    public void setItemBibliotecaCollection(Collection<ItemBiblioteca> itemBibliotecaCollection) {
        this.itemBibliotecaCollection = itemBibliotecaCollection;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codEditora != null ? codEditora.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 Editora)) {
            return false;
        }
        Editora other = (Editora) object;
        if ((this.codEditora == null && other.codEditora != null) || (this.codEditora != null && !this.codEditora.equals(other.codEditora))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.Dominio.Editora[ codEditora=" + codEditora + " ]";
    }
    
}

Utilizo o hibernate para criar a aplicação.
Não entendo por que classe Livro não pega o Sets e Gets das classes associadas na super classe ItemBiblioteca.

romarcio

Em primeiro lugar você deve usar o método setCodSecao e setCodEditora. É por eles que você vai adicionar a secao e a editora.
E eles recebem um objeto secao e um objeto editora e não um int.
Então tem que criar o os objetos para adicionar no método set.

Secao secao = new Secao();
//crie a secao com seus atributos e depois insira no setCodSecao
livro.setCodSecao(secao);
Hebert_Coelho

Sem ofensas aos colegas, em primeiro lugar acho que deve estudar melhor java e o padrão javabeans.

Entender a diferença entre get/set, como é utilizado em app desktop e depois avançar para uma aplicação web.

Vai melhorar e te adiantar muito no futuro.

Jackye
romarcio, assim que tenho que fazer?
Secao secao = new Secao();
        secao.getCodSecao();
        
        Editora editora = new Editora();
        editora.getCodEditora();    
           
        LivroDAO livroDAO = new LivroDAO();
        Livro l =  new Livro();
        l.setCodItemBiblioteca(1);
        l.setCodEditora(editora);
        l.setCodSecao(secao);
        l.setTitulo("Linguagem Java");
        l.setNuReferencia(1275567);
        l.setEdicao(3);
        l.setAnoEdicao(2009);
        l.setNumeroExemplar(6);
        l.setVolume(2);
        l.setIsbn(23154636);
        l.setDataCadastro(new Date());
        
        livroDAO.salvar(l);
Testei e deu o seguinte erro: [color=red] not-null property references a null or transient value: br.com.Dominio.Livro.codEditora[/color]

Lembrei que livro recebe atributos de ItemBiblioteca que é a Superclasse, e esta tem um relacionamento de N:N com a classe Autor, o problema é que livro não tá pegando o codAutor!! Como faço pra resolver isso?
Eu criei uma classe ItembibliotecaAutor por causa do relacionamento N:N. Só que ainda assim não consegui resolver nada!
:(

Veja os códigos: Na classe ItemBiblioteca coloquei os seguinte códigos para o relacionamento de N:N com Autor:
@ManyToMany(fetch= FetchType.LAZY)
    @JoinTable(name="ItemBibliotecaAutor", joinColumns={@JoinColumn(name="CodItemBiblioteca")},
                                    inverseJoinColumns={@JoinColumn(name = "CodAutor")})
    @Cascade(CascadeType.ALL)                                    
    private Collection <Autor> autor;
Na classe Autor coloquei os seguinte códigos para o relacionamento de N:N com ItemBiblioteca:
@ManyToMany(fetch= FetchType.LAZY)
    @JoinTable(name="ItemBibliotecaAutor", joinColumns={@JoinColumn(name="CodAutor")},
                                    inverseJoinColumns={@JoinColumn(name = "CodItemBiblioteca")})
    @Cascade(CascadeType.ALL)                                      
    private Collection <ItemBiblioteca> itemBiblioteca;
Entre elas tem uma classe chamada ItembibliotecaAutor que contém o seguinte código:
@Entity
@Table(name = "ItemBibliotecaAutor")
public class ItemBibliotecaAutor implements Serializable  {

@EmbeddedId   
private ItemBibliotecaAutorPK ChaveComposta;
}
que referencia a classe ItembibliotecaAutorPK que contem o seguinte código:
@ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="CodAutor")
    @Cascade(CascadeType.ALL)
    private Autor autor;
    
    @ManyToOne(fetch= FetchType.EAGER)
    @JoinColumn(name="CodItemBiblioteca")
    @Cascade(CascadeType.ALL)
    private ItemBiblioteca itemBiblioteca;
E aí como resolvo isso? há outra maneira de fazer relacionamento N:N com annotation do Hibernate?

Bjos! Até!

romarcio

Só que você precisa definir qual secao e qual editora vai inserir.

Isso está errado: secao.getCodSecao(); e isso também: editora.getCodEditora();
Você fez certo aqui:

Secao secao = new Secao();      
Editora editora = new Editora();

Mas precisa inserir em secao e em editora a secao e a editora correspondente. Para isso deve usar os métodos set de cada um deles.
Por exemplo:

secao.setCodSecao(1); secao.setNomeSecao("Informatica"); secao.setDataCadastro(new Date("10/11/2000"));

Ou então fazer uma pesquisa no banco de dados procurando pela secao correspondente:

Jackye

romarcio!

Consegui inserir no banco!! Obrigadinha!! :wink:

Eu fiz da seguinte maneira:
Session secao = HibernateUtil.getSessionFactory().openSession();
        
        Editora editora = (Editora) secao.load(Editora.class, 1);
        Secao s = (Secao) secao.load(Secao.class, 1);
                
        LivroDAO livroDAO = new LivroDAO();
        Livro livro =  new Livro();
        livro .setCodItemBiblioteca(2);
        livro .setCodEditora(editora);
        livro .setCodSecao(s);
        livro .setTitulo("Linguagem Java");
        livro .setNuReferencia(1275567);
        livro.setEdicao(3);
        livro .setAnoEdicao(2009);
        livro .setNumeroExemplar(6);
        livro .setVolume(2);
        livro .setIsbn(23154636);
        livro .setDataCadastro(new Date());
        
        livroDAO.salvar(livro);

OBRIGADA!! :thumbup:

romarcio

Legal :thumbup:

Criado 13 de dezembro de 2011
Ultima resposta 15 de dez. de 2011
Respostas 11
Participantes 3