[RESOLVIDO] Hibernate: many-to-one sem usar Annotations

Olá GUJ.

Sei que muitos dirão que eu posso encontrar tutoriais na internet, mas estou com um probleminha simples que até agora eu não consegui solucionar.

Seguinte, eu preciso fazer um relacionamento de many-to-one (ou one-to-many - ainda não entendi a diferença).
Tenho uma classe [Livros] e outra [Capitulos], onde um livro pode ter vários capitulos, mas cada capitulo só pode ser de um livro.
Como monto o xml de mapeamento e como faço o Set na classe?

Obrigado pela força.

Abraços.

<class name="livro" table="livro"><!--Nome reduzido LIV -->
<!-- suas propertys da classe livro -->
<set name="capitulo" table="capitulo" lazy="true" cascade="all">
            <key column="LIV_CODIGO" foreign-key="FK_CAP_LIV"/>
            <one-to-many class="capitulo"/>
</set>
</class>

e na classe capitulo

<class name="capitulo" table="capitulo"><!--Nome reduzido CAP -->
<!--suas propertys da classe capitulo -->
<many-to-one class="livro" name="livro" column="LIV_CODIGO" foreign-key="FK_CAP_LIV" not-null="true"/>
</class>

Obrigado.

Só mais uma coisa: para este caso, minha classes estão corretas:

[code]public class Capitulo {
private Long id;
private String descricao;
private Livro livro;

public Capitulo() {}

//aqui vão os Setter & Getters...

}

public class Livro {
private Long id;
private String descricao;
private Set capitulos = new HashSet();

public Livro() {}

//aqui vão os Setter & Getters...

}[/code]

Sim isso mesmo, mais ID como long? Normalmente eu uso integer ou String quando é uma sigla ou cfp por exemplo, mas vc que sabe. Sucesso

Estou com um problema muito parecido com o do nosso amigo Lucas, vou postar minhas classes e XML`s para ficar mais claro o meu problema.

Preciso fazer o relacionamento onde um Campeonato possui várias Etapas.

Ja coloquei todos os .jar necessários na biblioteca do meu projeto e também coloquei os XML`s no classpath, estou usando o Firebird 2.0 e
Netbean 6.0.1.

Preciso muito dessa ajuda gente!!!

Uma observação: Antes de tentar usar o relacionamento, estava inserindo corretamente no banco, ou seja, o Hibernate está configurado corretamente.

Classe Campeonato

package Controler;

public class CTR_campeonato {
private String nome, dtCampeonato;
private int idCampeonato;
private CTR_etapa etapa;

public CTR_campeonato()
{ }

public String getNome()
{return nome;}

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

public String getDtCampeonato()
{return dtCampeonato;}

public void setDtCampeonato(String DTCAMPEONATO)
{this.dtCampeonato = DTCAMPEONATO;}

public int getIdCampeonato()
{return idCampeonato;}

public void setIdCampeonato(int IDCAMPEONATO)
{this.idCampeonato = IDCAMPEONATO;}
}

Classe Etapa
package Controler;

public class CTR_etapa {
private String nome, cidade, estado, dtEtapa, hrEtapa;
private int idEtapa;

public CTR_etapa()
{ }

public String getNome()
{return nome;}

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

public String getCidade()
{return cidade;}

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

public String getEstado()
{return estado;}

public void setEstado(String ESTADO)
{this.estado = ESTADO;}

public String getDtEtapa()
{return dtEtapa;}

public void setDtEtapa(String DTETAPA)
{this.dtEtapa = DTETAPA;}

public String getHrEtapa()
{return hrEtapa;}

public void setHrEtapa(String HRETAPA)
{this.hrEtapa = HRETAPA;}

public int getIdEtapa()
{return idEtapa;}

public void setIdEtapa(int IDETAPA)
{this.idEtapa = IDETAPA;}
}

XML Campeonato

<?xml version="1.0" encoding="UTF-8"?>

XML Etapa

<?xml version="1.0" encoding="UTF-8"?>



ERRO no Netbeans 6.01

2008-07-31 11:10:59,515 WARN ehcache.config.Configurator No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/C:/Documents%20and%20Settings/Gustavo/Desktop/TC_Gustavo/Aplica%c3%a7%c3%a3o_de_Teste/Bibliotecas%20Hibernate%203.0.5/ehcache-1.1.jar!/ehcache-failsafe.xml
org.hibernate.PropertyNotFoundException: Could not find a getter for Campeonato in class Controler.CTR_etapa
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:213)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:207)
at org.hibernate.mapping.Property.getGetter(Property.java:240)
at org.hibernate.tuple.PojoTuplizer.buildPropertyGetter(PojoTuplizer.java:237)
at org.hibernate.tuple.AbstractTuplizer.(AbstractTuplizer.java:73)
at org.hibernate.tuple.PojoTuplizer.(PojoTuplizer.java:54)
at org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:47)
at org.hibernate.tuple.EntityMetamodel.(EntityMetamodel.java:21
at org.hibernate.persister.entity.BasicEntityPersister.(BasicEntityPersister.java:400)
at org.hibernate.persister.entity.SingleTableEntityPersister.(SingleTableEntityPersister.java:104)
at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:211)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1005)
at Model.HibernateUtility.(HibernateUtility.java:21)
at Model.DAO_campeonato.salvar(DAO_campeonato.java:1
at View.View_campeonato.jButton1ActionPerformed(View_campeonato.java:16
at View.View_campeonato.access$000(View_campeonato.java:15)
at View.View_campeonato$1.actionPerformed(View_campeonato.java:50)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:231
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:603
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:205
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:16
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at Model.HibernateUtility.getSession(HibernateUtility.java:31)
at Model.DAO_campeonato.salvar(DAO_campeonato.java:1
at View.View_campeonato.jButton1ActionPerformed(View_campeonato.java:16
at View.View_campeonato.access$000(View_campeonato.java:15)
at View.View_campeonato$1.actionPerformed(View_campeonato.java:50)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:231
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:603
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:205
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:16
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

A linha em negrito está me deixando doido já, não sei o que está acontecendo, talvés possa até ser uma coisa muito simples, mas infelizmente eu não sei mais o que fazer. Agradeço muito mesmo se alguem puder me ajudar…

Desde já Muito Obrigado

Esqueci de dizer que o erro aparece quando eu mando inserir um campeonato…

Desculpa pelo FLOOD…

Ajudem por favor!!!

Fnandos,

Usei Long porque na documentação do Hibernate, todos os exemplos de IDs são em Long. De fato, não sei se é o melhor.

Obrigado pela ajuda.
Abraços,
Lucas.

twunaives, o nome da class no seu set name=" " não fecha com o nome da class Controler.CTR_etapa, tem que ser o mesmo nome que vc declarou no atributo class, na sua classe campenato coloque

ao invés de CTR_etapa etapa, na classe etapa, coloque

deve resolver a exceção que ele apresentou. Coloque o codigo entre as tags code e /code do guj, fica mais legivel, espera que eu ajude a resolver esse problema. :smiley:

Bom fnandos, pelo que entendi, fiz as seguintes modificações.
Caso ainda falte alguma coisa ou modifiquei errado, me avise por favor…

Pra comecar os XML`s

Set no XML campeonato

<set name="Controler.CTR_etapa" table="ETAPA" lazy="true" cascade="all">
		<key column="IDCAMPEONATO" foreign-key="FK_ETAPA_1"/>
		<one-to-many class="Controler.CTR_etapa"/>
	</set>

Many-to-one no XML etapa

<many-to-one class="Controler.CTR_campeonato" 
			name="Controler.CTR_campeonato" 
			column="IDCAMPEONATO" 
			foreign-key="FK_ETAPA_1" 
			not-null="true"/>

Classe CTR_campeonato

package Controler;

import java.util.HashSet;
import java.util.Set;

public class CTR_campeonato {
   private String nome, dtCampeonato;
   private int idCampeonato;
   private Set CTR_etapa = new HashSet();

    public CTR_campeonato()
    { }
       
    public String getNome() 
    {return nome;}

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

    public String getDtCampeonato()
    {return dtCampeonato;}

    public void setDtCampeonato(String DTCAMPEONATO)
    {this.dtCampeonato = DTCAMPEONATO;}

    public int getIdCampeonato() 
    {return idCampeonato;}

    public void setIdCampeonato(int IDCAMPEONATO)
    {this.idCampeonato = IDCAMPEONATO;}
}

Class CTR_etapa

package Controler;

public class CTR_etapa {
    private String nome, cidade, estado, dtEtapa, hrEtapa;
    private int idEtapa;
    private CTR_campeonato campeonato;

    public CTR_etapa()
    { }

    public String getNome() 
    {return nome;}

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

    public String getCidade() 
    {return cidade;}

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

    public String getEstado()
    {return estado;}

    public void setEstado(String ESTADO)
    {this.estado = ESTADO;}

    public String getDtEtapa()
    {return dtEtapa;}

    public void setDtEtapa(String DTETAPA)
    {this.dtEtapa = DTETAPA;}

    public String getHrEtapa()
    {return hrEtapa;}

    public void setHrEtapa(String HRETAPA) 
    {this.hrEtapa = HRETAPA;}

    public int getIdEtapa() 
    {return idEtapa;}

    public void setIdEtapa(int IDETAPA) 
    {this.idEtapa = IDETAPA;}
}

vo colocar também a Ação do botão inserir no Frame View.View_campeonato

[code]
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
camp.setIdCampeonato(0);
camp.setNome(JTFnome.getText());
camp.setDtCampeonato(JTFdata.getText());

    DAO_campeonato.salvar(camp);   
} [/code]

e a classe Model.DAO_campeonato também

package Model;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.HibernateException;
import Controler.CTR_campeonato;

public class DAO_campeonato {

        public static void salvar(CTR_campeonato Campeonato){
            Session sessao = HibernateUtility.getSession();
            Transaction tx = null;
            try{
                tx = sessao.beginTransaction();
                sessao.save(Campeonato);
                tx.commit();
            }catch (HibernateException e){
                e.printStackTrace();
                tx.rollback();
            }finally{
                sessao.close();
            }
        }
}

eu fiz as modificações que vc havia me pedido para fazer, não surtiu nenhum efeito, o erro continua o mesmo. Talves eu tenha modificado errado.

Esse sisteminha é meu trabalho de conclusão de curso, gostaria muito mesmo que vc me ajudasse e que Deus o abençoe…

Botei quase todas as classes que estou utilizando, a única que nao coloquei foi a Model.HibernateUtility, caso seja necessário eu posto ela.

Muito Obrigado

Oi de novo cara, nas suas classes CTR.campeonato e etapa, falta os gets e sets de CTR.Etapa e CTR.campeonato, conforme vc passou nas declarações de atributos da classe, na action do JButton, falta dar um

onde vc criaria um novo objeto campeonato e dai vc salva esse objeto através do seu DAO que pra mim está correto.

Faz essas modificações e se não funcionar ainda, poste o seu HibernateUtility junto com o stracktrace da execeção que ele gerar.

Fnandos,

Seguinte, acredito que aquele erro que o netbeans estava apresentando seja do XML Campeonato, pois eu estava colocando o nele, e como quem possui a chave extrageira do relacionamento é a Tabela etapa, não tinha necessidade fazer mapeamento de ralação nos dois XMLs.

Fiz o seguinte, tirei o do XML Campeonato e tirei o do XML etapa. Após fazer isso coloquei e reconfigurei o no XML etapa.

O campeonato voltou a inserir normalmente, agora vou fazer os testes com a etapa.

Qualquer exito eu posto aki

muito obrigado pela ajuda meu camarada…

até +

Ah rapaz, tava esquecendo de mais uma coisa…

Estou tentando criar um Jcombobox no meu frame View.View_etapa buscando as chaves primarias dos campeonatos cadastrados, para que eu possa selecionar qual campeonato a etapa que estou cadastrando faz referencia.

Se vc tiver algum material ou um tópico com exemplos desse problema, para eu ter como apoio fico muito agradecido!

Vi um rapaz mensionando sobre GENESIS, não sei se é a melhor opção!!

fiz uma busca nessa manha aki no forum e no google, não achei nada parecido com o que estou querendo… :?

Se puder ajudar … MT Obrigado :smiley:

bem… aproveitando este tópico, deixo uma outra questão relacionada:

Supondo um relacionamento one-to-many entre Livro e Capitulo, querendo eu editar os dados de Livro, o hibernate acaba retirando as referencias aos capitulos ja cadastrados. o meu relacionamento é:

&lt;set name="capitulos" &gt;
	&lt;key column="livro_id" /&gt;
	&lt;one-to-many class="br.com.teste.Capitulo /&gt;
&lt;/set&gt;

alguem da uma ajuda ai! o que devo fazer para, ao alterar os dados de Livro, manter as referencias aos Capitulos ja associados no banco?

valeu">