Boa noite pessoal!
Como estou aprendendo um pouco de banco de dados relacional, decidi ver o suporte do hibernate para ele. Gostei pois uso o NetBeans então apenas digo quais são as tabelas e ele já gera o código com as colunas, índices, etc. Até aí tudo bem, mas estou com dúvida na hora de eu listar por exemplo os dados. Quando eu uso o criteria ele ja lista todos os dados das outras tabelas também mas como que faço para exibir? Se eu colocar um for que contém o objeto de uma classe diferente da que eu expecifiquei no criteria ele vai da erro de cast!
Olhem um código que tentei fazer:
Main:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Classes;
import Entidades.Comissao;
import Entidades.Grupoproduto;
import Entidades.Produto;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
/**
*
* @author Windows 7
*/
public class Main {
public static void main(String[] args) {
AnnotationConfiguration conf = new AnnotationConfiguration();
conf.configure();
SessionFactory factory = conf.buildSessionFactory();
Session session = factory.openSession();
List lista = session.createCriteria(Produto.class).list();
for (Comissao comissao : (List<Comissao>) lista) {
System.out.println(comissao.getPorcentagem());
}
System.out.println(lista);
session.close();
}
}
Entidades:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Entidades;
import java.io.Serializable;
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.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author Windows 7
*/
@Entity
@Table(name = "produto")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Produto.findAll", query = "SELECT p FROM Produto p"),
@NamedQuery(name = "Produto.findByProdutoID", query = "SELECT p FROM Produto p WHERE p.produtoID = :produtoID"),
@NamedQuery(name = "Produto.findByDescricao", query = "SELECT p FROM Produto p WHERE p.descricao = :descricao"),
@NamedQuery(name = "Produto.findByUnidade", query = "SELECT p FROM Produto p WHERE p.unidade = :unidade"),
@NamedQuery(name = "Produto.findByPrecoCusto", query = "SELECT p FROM Produto p WHERE p.precoCusto = :precoCusto"),
@NamedQuery(name = "Produto.findByPrecoVenda", query = "SELECT p FROM Produto p WHERE p.precoVenda = :precoVenda"),
@NamedQuery(name = "Produto.findBySaldoEstoque", query = "SELECT p FROM Produto p WHERE p.saldoEstoque = :saldoEstoque")})
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "ProdutoID")
private Integer produtoID;
@Basic(optional = false)
@Column(name = "Descricao")
private String descricao;
@Basic(optional = false)
@Column(name = "Unidade")
private String unidade;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(name = "PrecoCusto")
private Float precoCusto;
@Basic(optional = false)
@Column(name = "PrecoVenda")
private float precoVenda;
@Column(name = "SaldoEstoque")
private Float saldoEstoque;
@JoinColumn(name = "GrupoID", referencedColumnName = "GrupoID")
@ManyToOne(optional = false)
private Grupoproduto grupoID;
@JoinColumn(name = "ComissaoID", referencedColumnName = "ComissaoID")
@ManyToOne(optional = false)
private Comissao comissaoID;
public Produto() {
}
public Produto(Integer produtoID) {
this.produtoID = produtoID;
}
public Produto(Integer produtoID, String descricao, String unidade, float precoVenda) {
this.produtoID = produtoID;
this.descricao = descricao;
this.unidade = unidade;
this.precoVenda = precoVenda;
}
public Integer getProdutoID() {
return produtoID;
}
public void setProdutoID(Integer produtoID) {
this.produtoID = produtoID;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public String getUnidade() {
return unidade;
}
public void setUnidade(String unidade) {
this.unidade = unidade;
}
public Float getPrecoCusto() {
return precoCusto;
}
public void setPrecoCusto(Float precoCusto) {
this.precoCusto = precoCusto;
}
public float getPrecoVenda() {
return precoVenda;
}
public void setPrecoVenda(float precoVenda) {
this.precoVenda = precoVenda;
}
public Float getSaldoEstoque() {
return saldoEstoque;
}
public void setSaldoEstoque(Float saldoEstoque) {
this.saldoEstoque = saldoEstoque;
}
public Grupoproduto getGrupoID() {
return grupoID;
}
public void setGrupoID(Grupoproduto grupoID) {
this.grupoID = grupoID;
}
public Comissao getComissaoID() {
return comissaoID;
}
public void setComissaoID(Comissao comissaoID) {
this.comissaoID = comissaoID;
}
@Override
public int hashCode() {
int hash = 0;
hash += (produtoID != null ? produtoID.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 Produto)) {
return false;
}
Produto other = (Produto) object;
if ((this.produtoID == null && other.produtoID != null) || (this.produtoID != null && !this.produtoID.equals(other.produtoID))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entidades.Produto[ produtoID=" + produtoID + " ]";
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Entidades;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
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;
/**
*
* @author Windows 7
*/
@Entity
@Table(name = "grupoproduto")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Grupoproduto.findAll", query = "SELECT g FROM Grupoproduto g"),
@NamedQuery(name = "Grupoproduto.findByGrupoID", query = "SELECT g FROM Grupoproduto g WHERE g.grupoID = :grupoID"),
@NamedQuery(name = "Grupoproduto.findByDescricao", query = "SELECT g FROM Grupoproduto g WHERE g.descricao = :descricao")})
public class Grupoproduto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "GrupoID")
private Integer grupoID;
@Basic(optional = false)
@Column(name = "Descricao")
private String descricao;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "grupoID")
private Collection<Produto> produtoCollection;
public Grupoproduto() {
}
public Grupoproduto(Integer grupoID) {
this.grupoID = grupoID;
}
public Grupoproduto(Integer grupoID, String descricao) {
this.grupoID = grupoID;
this.descricao = descricao;
}
public Integer getGrupoID() {
return grupoID;
}
public void setGrupoID(Integer grupoID) {
this.grupoID = grupoID;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
@XmlTransient
public Collection<Produto> getProdutoCollection() {
return produtoCollection;
}
public void setProdutoCollection(Collection<Produto> produtoCollection) {
this.produtoCollection = produtoCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (grupoID != null ? grupoID.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 Grupoproduto)) {
return false;
}
Grupoproduto other = (Grupoproduto) object;
if ((this.grupoID == null && other.grupoID != null) || (this.grupoID != null && !this.grupoID.equals(other.grupoID))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entidades.Grupoproduto[ grupoID=" + grupoID + " ]";
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Entidades;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
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;
/**
*
* @author Windows 7
*/
@Entity
@Table(name = "comissao")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Comissao.findAll", query = "SELECT c FROM Comissao c"),
@NamedQuery(name = "Comissao.findByComissaoID", query = "SELECT c FROM Comissao c WHERE c.comissaoID = :comissaoID"),
@NamedQuery(name = "Comissao.findByPorcentagem", query = "SELECT c FROM Comissao c WHERE c.porcentagem = :porcentagem")})
public class Comissao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "ComissaoID")
private String comissaoID;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(name = "Porcentagem")
private Float porcentagem;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "comissaoID")
private Collection<Produto> produtoCollection;
public Comissao() {
}
public Comissao(String comissaoID) {
this.comissaoID = comissaoID;
}
public String getComissaoID() {
return comissaoID;
}
public void setComissaoID(String comissaoID) {
this.comissaoID = comissaoID;
}
public Float getPorcentagem() {
return porcentagem;
}
public void setPorcentagem(Float porcentagem) {
this.porcentagem = porcentagem;
}
@XmlTransient
public Collection<Produto> getProdutoCollection() {
return produtoCollection;
}
public void setProdutoCollection(Collection<Produto> produtoCollection) {
this.produtoCollection = produtoCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (comissaoID != null ? comissaoID.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 Comissao)) {
return false;
}
Comissao other = (Comissao) object;
if ((this.comissaoID == null && other.comissaoID != null) || (this.comissaoID != null && !this.comissaoID.equals(other.comissaoID))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Entidades.Comissao[ comissaoID=" + comissaoID + " ]";
}
}
Essa é a saída:
run:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate:
select
this_.ProdutoID as ProdutoID0_2_,
this_.ComissaoID as ComissaoID0_2_,
this_.Descricao as Descricao0_2_,
this_.GrupoID as GrupoID0_2_,
this_.PrecoCusto as PrecoCusto0_2_,
this_.PrecoVenda as PrecoVenda0_2_,
this_.SaldoEstoque as SaldoEst5_0_2_,
this_.Unidade as Unidade0_2_,
comissao2_.ComissaoID as ComissaoID2_0_,
comissao2_.Porcentagem as Porcenta2_2_0_,
grupoprodu3_.GrupoID as GrupoID1_1_,
grupoprodu3_.Descricao as Descricao1_1_
from
produto this_
inner join
comissao comissao2_
on this_.ComissaoID=comissao2_.ComissaoID
inner join
grupoproduto grupoprodu3_
on this_.GrupoID=grupoprodu3_.GrupoID
Exception in thread "main" java.lang.ClassCastException: Entidades.Produto cannot be cast to Entidades.Comissao
at Classes.Main.main(Main.java:28)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 10 segundos)
Obrigado!