Exemplo de mapeamento no Hibernate

3 respostas
guivirtuoso

Boa Tarde,

Tenho 2 classes

public class Pessoa implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private Integer codigo;
    private String nome;
    private String sobrenome;
    private String email;
    private Endereco endereco;

    /** ... getters e setters **/

}

e

public class Endereco implements Serializable {
    
    private static final long serialVersionUID = 1L;
    private String nomeLogradouro;
    private String numero;
    private String bairro;
    private String cep;
    private String cidade;
    private String estado;
    private String pais;

    /** ... getters e setters **/

}

Fiz o mapeamento da classe Pessoa e testei (SELECT, INSERT, UPDATE e DELETE) somente com os campos dela e tudo funcionou perfeitamente, no entanto agora estou tentando relacionar com o Endereco conforme segue:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <class name="Pessoa" table="pessoas">
        
        <!-- ID da classe -->
        <id name="codigo" column="codigo" type="java.lang.Integer">
            <generator class="assigned"/>
        </id>
        
        <!-- Propriedades da classe -->
        <property name="nome" column="nome" type="java.lang.String" />
        <property name="sobrenome" column="sobrenome" type="java.lang.String" />
        <property name="email" column="email" type="java.lang.String" />
        
        <!-- Relacionamento da classe -->
        <many-to-one name="endereco" class="Endereco" column="codigo_pessoa" cascade="all" unique="true"/>
        
    </class>
</hibernate-mapping>

e

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    <hibernate-mapping>
    <class name="Endereco" table="enderecos">
        
        <!-- Propriedades da classe -->
        <property name="nomeLogradouro" column="logradouro" type="java.lang.String" />
        <property name="numero" column="numero" type="java.lang.String" />
        <property name="bairro" column="bairro" type="java.lang.String" />
        <property name="cep" column="cep" type="java.lang.String" />
        <property name="cidade" column="cidade" type="java.lang.String" />
        <property name="estado" column="estado" type="java.lang.String" />
        <property name="pais" column="pais" type="java.lang.String" />
        
        <!-- Relacionamento da classe -->
        <one-to-one name="pessoa" class="Pessoa" property-ref="endereco"/>
        
    </class>
</hibernate-mapping>

Ao estartar a aplicação ocorre o seguinte erro:

Exception in thread AWT-EventQueue-0 org.hibernate.MappingException: An association from the table pessoas refers to an unmapped class: Endereco

at org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1050)

at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1000)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1084)

A relacao das tabelas no Oracle eh a seguinte:

Tabela PESSOAS
CODIGO PK
… demais colunas

Tabela ENDERECOS
CODIGO_PESSOA FK
… demais colunas

Já pesquisei em todos os lugares e os exemplos que encontrei infelizmente não me fizeram enchergar onde esta o meu erro…

Att,

3 Respostas

L
pq nao usa anotacoes e mais facil e mais legivel tbm: exmplo de relacionamento entre cidade e estado:
/*
 * Estado.java
 *
 * Created on 19 de Janeiro de 2008, 10:36
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.Lgweb.Tcc.Model;

import java.io.Serializable;
import java.util.Collection;
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.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Classe de entidade Estado
 * 
 * @author leandro
 */
@Entity
@Table(name = "estado")
/*@NamedQueries( {
        @NamedQuery(name = "Estado.findByEstadoid", query = "SELECT e FROM Estado e WHERE e.estadoid = :estadoid"),
        @NamedQuery(name = "Estado.findByEstado", query = "SELECT e FROM Estado e WHERE e.uf = :estado"),
        @NamedQuery(name = "Estado.findBySigla", query = "SELECT e FROM Estado e WHERE e.sigla = :sigla")
    }) */
    @SequenceGenerator(name = "geraCodEstado", sequenceName = "geraCodEstado")

public class Estado implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "geraCodEstado") 

    @Column(name = "estadoid", nullable = false)
    private Integer estadoid;

    @Column(name = "estado")
    private String uf;

    @Column(name = "sigla")
    private String sigla;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "estadoid")
    private Collection<Cidade> cidadeCollection;

    /** Creates a new instance of Estado */
    public Estado() {}

    /**
     * Cria uma nova instância de Estado com os valores especificados.
     * @param estadoid o estadoid do Estado
     */
    public Estado(Integer estadoid) {
        this.estadoid = estadoid;
    }

    /**
     * Define o estadoid deste Estado.
     * @return o estadoid
     */
    public Integer getEstadoid() {
        return this.estadoid;
    }

    /**
     * Define o estadoid deste Estado para o valor especificado.
     * @param estadoid o novo estadoid
     */
    public void setEstadoid(Integer estadoid) {
        this.estadoid = estadoid;
    }

    /**
     * Define o estado deste Estado.
     * @return o estado
     */
    public String getUf() {
        return this.uf;
    }

    /**
     * Define o estado deste Estado para o valor especificado.
     * @param estado o novo estado
     */
    public void setUf(String uf) {
        this.uf = uf;
    }

    /**
     * Define o sigla deste Estado.
     * @return o sigla
     */
    public String getSigla() {
        return this.sigla;
    }

    /**
     * Define o sigla deste Estado para o valor especificado.
     * @param sigla o novo sigla
     */
    public void setSigla(String sigla) {
        this.sigla = sigla;
    }

    /**
     * Define o cidadeCollection deste Estado.
     * @return o cidadeCollection
     */
    public Collection<Cidade> getCidadeCollection() {
        return this.cidadeCollection;
    }

    /**
     * Define o cidadeCollection deste Estado para o valor especificado.
     * @param cidadeCollection o novo cidadeCollection
     */
    public void setCidadeCollection(Collection<Cidade> cidadeCollection) {
        this.cidadeCollection = cidadeCollection;
    }

    /**
     * Retorna um valor de código hash para o objeto.  Esta implementação computa
     * um valor de código hash baseado nos campos id deste objeto.
     * @return um valor de código hash para este objeto.
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.estadoid != null ? this.estadoid.hashCode() : 0);
        return hash;
    }

    /**
     * Determina se outro objeto é igual a este Estado.  O resultado é
     * <code>true</code> se e somente se o argumento não for nulo e for um objeto Estado o qual
     * tem o mesmo valor para o campo id como este objeto.
     * @param object o objeto de referência com o qual comparar
     * @return <code>true</code> se este objeto é o mesmo como o argumento;
     * <code>false</code> caso contrário.
     */
    @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 Estado)) {
            return false;
        }
        Estado other = (Estado)object;
        if (this.estadoid != other.estadoid && (this.estadoid == null || !this.estadoid.equals(other.estadoid))) return false;
        return true;
    }

    /**
     * Retorna uma representação literal deste objeto.  Esta implementação cria
     * uma representação baseada nos campos id.
     * @return uma representação literal deste objeto.
     */
    @Override
    public String toString() {
    	 return " " + estadoid + " " + " --- " +" "+ sigla ;
    }

}










/*
 * Cidade.java
 *
 * Created on 19 de Janeiro de 2008, 10:36
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.Lgweb.Tcc.Model;

import java.io.Serializable;
import java.util.Collection;
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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

/**
 * Classe de entidade Cidade
 * 
 * @author leandro
 */
@Entity
@Table(name = "cidade")
/*@NamedQueries( {
        @NamedQuery(name = "Cidade.findByCidadeid", query = "SELECT c FROM Cidade c,Pessoafisica pf ,Pessoajuridica pj ,ramoatividade r" +
        		" WHERE c.cidadeid = :cidadeid and c.cidadeid=pf.cidadeid or c.cidadeid=pj.cidadeid c.cidadeid=r.cidadeid  "),
        @NamedQuery(name = "Cidade.findByCidadenome", query = "SELECT c FROM Cidade c WHERE c.cidadenome = :cidadenome")
    }) */
    @SequenceGenerator(name = "geraCodCidade", sequenceName = "geraCodCidade")
public class Cidade implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id @GeneratedValue(strategy = GenerationType.AUTO, generator = "geraCodCidade") 
    @Column(name = "cidadeid", nullable = false)
    private Integer cidadeid;

    @Column(name = "cidadenome")
    private String cidadenome;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cidadeid")
    private Collection<Fornecedor> fornecedorCollection;

    @JoinColumn(name = "estadoid", referencedColumnName = "estadoid")
    @ManyToOne
    private Estado estadoid;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "cidadeid")
    private Collection<Cliente> clienteCollection;

    /** Creates a new instance of Cidade */
    public Cidade() {
    }

    /**
     * Cria uma nova instância de Cidade com os valores especificados.
     * @param cidadeid o cidadeid do Cidade
     */
    public Cidade(Integer cidadeid) {
        this.cidadeid = cidadeid;
    }

    /**
     * Define o cidadeid deste Cidade.
     * @return o cidadeid
     */
    public Integer getCidadeid() {
        return this.cidadeid;
    }

    /**
     * Define o cidadeid deste Cidade para o valor especificado.
     * @param cidadeid o novo cidadeid
     */
    public void setCidadeid(Integer cidadeid) {
        this.cidadeid = cidadeid;
    }

    /**
     * Define o cidadenome deste Cidade.
     * @return o cidadenome
     */
    public String getCidadenome() {
        return this.cidadenome;
    }

    /**
     * Define o cidadenome deste Cidade para o valor especificado.
     * @param cidadenome o novo cidadenome
     */
    public void setCidadenome(String cidadenome) {
        this.cidadenome = cidadenome;
    }

    /**
     * Define o fornecedorCollection deste Cidade.
     * @return o fornecedorCollection
     */
    public Collection<Fornecedor> getFornecedorCollection() {
        return this.fornecedorCollection;
    }

    /**
     * Define o fornecedorCollection deste Cidade para o valor especificado.
     * @param fornecedorCollection o novo fornecedorCollection
     */
    public void setFornecedorCollection(Collection<Fornecedor> fornecedorCollection) {
        this.fornecedorCollection = fornecedorCollection;
    }

    /**
     * Define o estadoid deste Cidade.
     * @return o estadoid
     */
    public Estado getEstadoid() {
        return this.estadoid;
    }

    /**
     * Define o estadoid deste Cidade para o valor especificado.
     * @param estadoid o novo estadoid
     */
    public void setEstadoid(Estado estadoid) {
        this.estadoid = estadoid;
    }

    /**
     * Define o clienteCollection deste Cidade.
     * @return o clienteCollection
     */
    public Collection<Cliente> getClienteCollection() {
        return this.clienteCollection;
    }

    /**
     * Define o clienteCollection deste Cidade para o valor especificado.
     * @param clienteCollection o novo clienteCollection
     */
    public void setClienteCollection(Collection<Cliente> clienteCollection) {
        this.clienteCollection = clienteCollection;
    }

    /**
     * Retorna um valor de código hash para o objeto.  Esta implementação computa
     * um valor de código hash baseado nos campos id deste objeto.
     * @return um valor de código hash para este objeto.
     */
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (this.cidadeid != null ? this.cidadeid.hashCode() : 0);
        return hash;
    }

    /**
     * Determina se outro objeto é igual a este Cidade.  O resultado é
     * <code>true</code> se e somente se o argumento não for nulo e for um objeto Cidade o qual
     * tem o mesmo valor para o campo id como este objeto.
     * @param object o objeto de referência com o qual comparar
     * @return <code>true</code> se este objeto é o mesmo como o argumento;
     * <code>false</code> caso contrário.
     */
    @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 Cidade)) {
            return false;
        }
        Cidade other = (Cidade)object;
        if (this.cidadeid != other.cidadeid && (this.cidadeid == null || !this.cidadeid.equals(other.cidadeid))) return false;
        return true;
    }

    /**
     * Retorna uma representação literal deste objeto.  Esta implementação cria
     * uma representação baseada nos campos id.
     * @return uma representação literal deste objeto.
     */
    @Override
    public String toString() {
        return cidadenome;
    }

}
guivirtuoso

Vlw lgweb,

irei implementar o sugerido, achei mais claro também.

Só mais uma dúvida, a minha implementação da SessionFactory esta desse jeito:

private SessionFactory factory = new Configuration().addClass(Pessoa.class)
                                                                          .addClass(Endereco.class).buildSessionFactory();

Isso terá que mudar também por causa do uso das Annotations ou a unica mudanca é deixar de usar os .hbm mesmo ?

Marky.Vasconcelos

Sua SessionFactory ficara assim:

AnnotationConfiguration cfg = new AnnotationConfiguration();
cfg.addAnnotatedClass(Pessoa.class);
cfg.addAnnotatedClass(Endereco.clas);
SessionFactory factory = cfg.buildSessionFactory();
Criado 28 de março de 2008
Ultima resposta 31 de mar. de 2008
Respostas 3
Participantes 3