Dificuldade em criar um for para cadastro de Exemplares de Obras

11 respostas
Jackye

Olá!
Estou desenvolvendo um sistema bibliotecário.
Gostaria de criar um método que cadastrasse os exemplares assim na hora de cadastrar a obra.
Vendo as classes e a logica, temos que uma obra possui muitos exemplares.

Aqui tenho um código que to tentando usar para cadastrar obra e exemplar ao mesmo tempo:
public static void main(String[] args) {

        Session sessao = HibernateUtil.getSessionFactory().openSession();
        Transaction transacao = sessao.beginTransaction();

        Exemplar exemplar = new Exemplar();
        Livro livro1 = new Livro();

        livro1.setTitulo("Design Gráfico");
        livro1.setIsbn(123456789);
        livro1.setNuExemplar(4);

//Este laço deve se repetir de acordo com a quantidade de exemplares que a obra. E este laço está me retornando apenas 1 exemplar, sendo que a obra tem 4, por exemplo.
        for (int i = 0; i < livro1.getNuExemplar(); i++) {
            exemplar.setCodObra(livro1);
            exemplar.setInConsulta(Short.MIN_VALUE);
            exemplar.setInEmprestimo(Short.MIN_VALUE);
//Tambem preciso indicar um livro que fique na biblioteca e não possa ser utilizado para emprestimo. Então fiz o seguinte:
            if (i == 0) {
//Se for o primeiro exemplar a ser cadastrado não vai sair da biblioteca, será um exemplar de consulta.
            }
        }
//Como é um livro e autor tem relacionamento de muitos para muitos, eu adiciono a quantidade de autores desta forma:
        Autor autor1 = (Autor) sessao.get(Autor.class, 2);
       Autor autor2 = (Autor) sessao.get(Autor.class, 4);
      Autor autor2 = (Autor) sessao.get(Autor.class, 6);
        livro1.getAutor().add(autor1);
        livro1.getAutor().add(autor2);
        livro1.getAutor().add(autor3);

        sessao.save(livro1);
        transacao.commit();
        sessao.close();
    }
O problema aí é o laço for. Quero cadastrar o exemplar a partir da quantidade de exemplares do livro. Alguém pode me ajudar? Agradeço. :D

11 Respostas

gabrielemidio

Posta a classe Livro fazendo favor!

um modo mais facil serial você criar um int receber a quantidade e fazer esse laço através do int!

Abraços

Jackye

Oi, gabrielemidio!

Estas são as classes:

Classe Livro:

package Dominio;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;

@Entity
@PrimaryKeyJoinColumn(name="CodObra")
@Table(name = "Livro", catalog = "dbTestesRegras", schema = "dbo")

@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Livro.findAll", query = "SELECT l FROM Livro l"),
    @NamedQuery(name = "Livro.findByIsbn", query = "SELECT l FROM Livro l WHERE l.isbn = :isbn"),
    @NamedQuery(name = "Livro.findByCodObra", query = "SELECT l FROM Livro l WHERE l.codObra = :codObra")})

public class Livro extends Obra implements Serializable {
    private static final long serialVersionUID = 1L;
    @Column(name = "ISBN")
    private Integer isbn;
   
    public Livro() {
    }

    public Integer getIsbn() {
        return isbn;
    }

    public void setIsbn(Integer isbn) {
        this.isbn = isbn;
    }

    @Override
    public String toString() {
        return "Teste.Livro[ codObra=" + getCodObra() + " ]";
    }
}

Classe Obra:

package Dominio;

import Dominio.Exemplar;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "Obra", catalog = "dbTestesRegras", schema = "dbo")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Obra.findAll", query = "SELECT o FROM Obra o"),
    @NamedQuery(name = "Obra.findByCodObra", query = "SELECT o FROM Obra o WHERE o.codObra = :codObra"),
    @NamedQuery(name = "Obra.findByTitulo", query = "SELECT o FROM Obra o WHERE o.titulo = :titulo")})
public class Obra implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CodObra", nullable = false)
    private Integer codObra;
    @Column(name = "Titulo", length = 30)
    private String titulo;
    @Basic(optional = false)
    @Column(name = "NuExemplar", nullable = false)
    private int nuExemplar;
   
    //O FetchType.LAZY significa que o conteúdo da super classe será trazido apenas na primeira solicitação. 
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "ObraAutor", joinColumns = {
        @JoinColumn(name = "CodObra")},
    inverseJoinColumns = {
        @JoinColumn(name = "CodAutor")})
    //O Annotation Cascade mostra uma opção de executar todos os comandos nas classes relacionadas.
    @Cascade(CascadeType.ALL)
    private Collection<Autor> autor = new ArrayList<Autor>();
    
    @OneToMany(mappedBy = "codObra", fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<Exemplar> exemplar = new ArrayList<Exemplar>();
    
    @ManyToMany
    @JoinTable(name = "EmprestimoObra", joinColumns = {
        @JoinColumn(name = "CodObra")},
    inverseJoinColumns = {
        @JoinColumn(name = "CodEmprestimo")})
    @Cascade(CascadeType.ALL)
    private Collection<Emprestimo> emprestimo;

    public Obra() {
    }

    public Obra(Integer codObra) {
        this.codObra = codObra;
    }

    public Integer getCodObra() {
        return codObra;
    }

    public void setCodObra(Integer codObra) {
        this.codObra = codObra;
    }

    public String getTitulo() {
        return titulo;
    }

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

    public int getNuExemplar() {
        return nuExemplar;
    }

    public void setNuExemplar(int nuExemplar) {
        this.nuExemplar = nuExemplar;
    }

    @XmlTransient
    public Collection<Emprestimo> getEmprestimo() {
        return emprestimo;
    }

    public void setEmprestimo(Collection<Emprestimo> emprestimo) {
        this.emprestimo = emprestimo;
    }

    @XmlTransient
    public Collection<Autor> getAutor() {
        return autor;
    }

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

    @XmlTransient
    public Collection<Exemplar> getExemplar() {
        return exemplar;
    }

    public void setExemplar(Collection<Exemplar> exemplar) {
        this.exemplar = exemplar;
    }

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

    @Override
    public String toString() {
        return "Dominio.Obra[ codObra=" + codObra + " ]";
    }
}

Classe Exemplar:

package Dominio;

import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@Entity
@Table(name = "Exemplar", catalog = "dbTestesRegras", schema = "dbo")

@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Exemplar.findAll", query = "SELECT e FROM Exemplar e"),
    @NamedQuery(name = "Exemplar.findByCodExemplar", query = "SELECT e FROM Exemplar e WHERE e.codExemplar = :codExemplar"),
    @NamedQuery(name = "Exemplar.findByInConsulta", query = "SELECT e FROM Exemplar e WHERE e.inConsulta = :inConsulta"),
    @NamedQuery(name = "Exemplar.findByInEmprestimo", query = "SELECT e FROM Exemplar e WHERE e.inEmprestimo = :inEmprestimo")})

public class Exemplar implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "CodExemplar", nullable = false)
    private Integer codExemplar;
    @Column(name = "InConsulta")
    private Short inConsulta;
    @Basic(optional = false)
    @Column(name = "InEmprestimo", nullable = false)
    private short inEmprestimo;
    
    @ManyToMany
    @JoinTable(name = "EmprestimoObra", joinColumns = {
        @JoinColumn(name = "CodEmprestimo", referencedColumnName = "CodExemplar", nullable = false)}, inverseJoinColumns = {
        @JoinColumn(name = "CodExemplar", referencedColumnName = "CodEmprestimo", nullable = false)}) 
    private Collection<Emprestimo> emprestimo;
    
    @ManyToOne
    @JoinColumn(name = "CodObra", referencedColumnName = "CodObra")
    private Obra codObra;

    public Exemplar() {
    }

    public Exemplar(Integer codExemplar) {
        this.codExemplar = codExemplar;
    }

    public Exemplar(Integer codExemplar, short inEmprestimo) {
        this.codExemplar = codExemplar;
        this.inEmprestimo = inEmprestimo;
    }

    public Integer getCodExemplar() {
        return codExemplar;
    }

    public void setCodExemplar(Integer codExemplar) {
        this.codExemplar = codExemplar;
    }

    public Short getInConsulta() {
        return inConsulta;
    }

    public void setInConsulta(Short inConsulta) {
        this.inConsulta = inConsulta;
    }

    public short getInEmprestimo() {
        return inEmprestimo;
    }

    public void setInEmprestimo(short inEmprestimo) {
        this.inEmprestimo = inEmprestimo;
    }

    @XmlTransient
    public Collection<Emprestimo> getEmprestimo() {
        return emprestimo;
    }

    public void setEmprestimo(Collection<Emprestimo> emprestimo) {
        this.emprestimo = emprestimo;
    }
    
    public Obra getCodObra() {
        return codObra;
    }

    public void setCodObra(Obra codObra) {
        this.codObra = codObra;
    }

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

    @Override
    public String toString() {
        return "Dominio.Exemplar[ codExemplar=" + codExemplar + " ]";
    }    
}

Tenho aí uma herança de obra e livro: Livro recebe tudo de Obra.
Também tem aí um relacionamento de um para muitos entre obra e exemplar, ou seja, uma obra possui muitos exemplares.

:smiley:

E como eu poderia fazer a chamada int? Eu não entendi. :shock:

gabrielemidio

Nossa me desculpe fiz total confusão aqui! estava achando que o problema e na quantidade do laço, mas vamos lá você na verdade quer cadastrar o livro pela quantidade que foi fornecida e o laço não está fazendo isso?

as vezes pode ser isso :

livro1.setTitulo("Design Gráfico"); livro1.setIsbn(123456789); livro1.setNuExemplar(4);

Você fornece esses dados apenas uma vez portando ele vai retornar um registro apenas.

Jackye

Olá gabrielemidio.

Olha, o get e set já está definido na classe Obra, onde livro tem herança:
public int getNuExemplar() {
        return nuExemplar;
    }

    public void setNuExemplar(int nuExemplar) {
        this.nuExemplar = nuExemplar;

    }
E a variável NuExemplar já está definido no inicio da classe:
private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "CodObra", nullable = false)
    private Integer codObra;
    @Column(name = "Titulo", length = 30)
    private String titulo;
    @Basic(optional = false)
    @Column(name = "NuExemplar", nullable = false)
//Bem aqui:
    private int nuExemplar;

E agora o que faço?
Os códigos que me sugeriu eu não consegui resolver.
:(

gabrielemidio

Então eu fiz confusão!na verdade você está querendo complementar os dados e não a quantidade de vezes que elevai fazer o laço

acredito que o erro esteja aqui:

livro1.setTitulo("Design Gráfico");  
        livro1.setIsbn(123456789);

Por que mesmo que a quantidade seja 4, você só informou esses dados apenas uma vez tenta colocar eles depois do for para ve se da certo! a quantidade você deixa antes!

Jackye

Olá.

Não consegui compreender:

as vezes pode ser isso :

view plaincopy to clipboardprint?

livro1.setTitulo(Design Gráfico);

livro1.setIsbn(123456789);

livro1.setNuExemplar(4);

Você fornece esses dados apenas uma vez portando ele vai retornar um registro apenas.

Como assim forneci os dados apenas uma vez? Tem como fazer um laço para contar isso quantas vezes estiver na variável Nuexemplar (SetNuExemplar)?

gabrielemidio

então tenta coloca esse código dentro do for para ver se dá certo pq ali vc só fornece apenas uma vez

Jackye

Oi.

Tentei fazer como falou, mas não tá cadastrando. E nem tá pegando a quantidade de exemplares. Veja o código:
Session sessao = HibernateUtil.getSessionFactory().openSession();
        Transaction transacao = sessao.beginTransaction();

        short i;
        i = 0;
        short j;
        j = 1;

        Exemplar exemplar = new Exemplar();
        Livro livro1 = new Livro();
       
        for (int n = 0; n < livro1.getNuExemplar(); n++) {
            exemplar.setCodObra(livro1);
            exemplar.setInConsulta(i);
            exemplar.setInEmprestimo(i);
            if (n == 0) {
                JOptionPane.showMessageDialog(null, "Este não pode ser emprestado!");
           }

            livro1.setTitulo("O Mago");
            livro1.setIsbn(123456789);
            livro1.setNuExemplar(4);

            Autor autor1 = (Autor) sessao.get(Autor.class, 6);
            livro1.getAutor().add(autor1);
        }
        sessao.save(exemplar);
        transacao.commit();
        sessao.close();
    }
Jackye
Eu tentei fazer da seuinte forma:
public static void main(String[] args) {
        
        Session sessao = HibernateUtil.getSessionFactory().openSession();
        Transaction transacao = sessao.beginTransaction();
        
// estes valores são para definir se o livro tá emprestado ou é só pra consulta, no caso 0 = tá liberado e 1 = tá emprestado ou é apenas para consulta.
        short i;
        i = 0;
        short j;
        j = 1;
        
        Exemplar exemplar = new Exemplar();
        Livro livro = new Livro();
        livro.setNuExemplar(4);
        Autor autor = (Autor) sessao.get(Autor.class, 6);
        livro.getAutor().add(autor);
        
       for (int n = 0; n < livro.getNuExemplar(); n++) {
            exemplar.setCodObra(livro);
            exemplar.setInEmprestimo(i);
//Esse laço if vai definir o primeiro exemplar igual  a 1, ou seja, ele não vai estar disponível para empréstimo.
            if (n == 0) {
                exemplar.setInConsulta(j);
                JOptionPane.showMessageDialog(null, "Este não pode ser emprestado!");
            }
            
            livro.setTitulo("O Mago");
            livro.setIsbn(123456789);
            livro.setNuExemplar(4);
            
        }
        sessao.save(livro);
        sessao.save(exemplar);
        transacao.commit();
        sessao.close();
    }

Tá cadastrado a Obra, o exemplar tambem, porém, não a quantidade que solicito, isto é, no exemplo que usei aí:
Tenho uma obra cuja quantidade de exemplares é igual a 4, mas o laço tá cadastrando apenas 1!!

Como resolvo isso?

:cry:

gabrielemidio

TENTA ASSIM

livro1.setNuExemplar(4);

    for (int n = 0; n < livro1.getNuExemplar(); n++) {  
           livro1.setTitulo("O Mago");  
           livro1.setIsbn(123456789);  
           exemplar.setCodObra(livro1);  
           exemplar.setInConsulta(i);  
           exemplar.setInEmprestimo(i);  
                
          

}
Jackye

olá.

Fiz isso que mandou, mas continua cadastrado apenas 1 exemplar.

Tem como usar outro metodo para cadastrar exemplar usando a mesma logica?

:frowning:

Criado 11 de fevereiro de 2012
Ultima resposta 12 de fev. de 2012
Respostas 11
Participantes 2