Hibernate + FK = Dor de Cabeça

Olá Galera GUJ,

Estou tentando desenvolver um sistema que cadastra um campeonato e atribui várias etapas a este campeonato.
Ex: Campeonato de Minas Gerais(Etapa Juiz de Fora, Etapa Belo Horizonte, Etapa Ouro Preto).

tenho 2 tabelas em meu banco, a tabela Campeonato e tabela Etapa que possuem um relacionamento 1:n, dessa forma, na tabela Etapa existe uma chave estrangeira q faz referencia a chave primaria da tabela Campeoanto. Até aí tudo bem.

Tenho 2 telas, uma eu insiro o Campeonato e na outra eu ensiro as etapas referente a este campeonato. Na tela de Cadastrar os Campeonatos, funfa direitinho.

Na tela de cadastrar Etapas fiz um JCombobox mostrando o nome de todos os Campeonatos persitidos até o momento.

A pergunta é, como eu faço para escolher um dos campeonatos cadastrados(utilizando Jcombobox que ja está funcionando) e Cadastrar várias etapas para este campeonato???

Estou utilizando Netbenas 6.0.1 + FireBird2.0 + Hibernate 3.0.

Estou precisando mt de ajuda!! Obrigado

Se você tiver uma collection de Etapas em Campeonato (ex: List<Etapa> etapas) você pode ir adicionando essas etapas à collection (etapas.add()) e depois dar um update no campeonato.

Sim, eu tenho na classe POJO Campeonato a seguinte declaração:

Private Set Etapas = new HashSet();

Tenho 3 Pacotes: Controler, Model e View.
Sendo que as POJO ficam em Controler e a classe q estou inserindo as Etapas fica em View, logo não tem como eu acessa-la pois está privado.

Olha só meus códigos:

XML CAMPEONATO

<?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="Controler.CTR_campeonato" table="CAMPEONATO">
        <id name="idCampeonato" column="IDCAMPEONATO">
            <generator class="increment"/>
        </id>

        <property name="nome" column="NOME"/>
	<property name="dtCampeonato" column="DATACAMPEONATO"/>	
	
	<set name="Etapas" inverse="true" lazy="true">
		<key column="CAMPEONATO_IDCAMPEONATO" not-null="true"/>
		<one-to-many class="Controler.CTR_etapa"/>
	</set>

	<set name="Indices" inverse="true" lazy="true">
		<key column="CAMPEONATO_IDCAMPEONATO"/>
		<one-to-many class="Controler.CTR_indice"/>
	</set>

	<set name="Clubes" table="CLUBES_NOS_CAMPEONATOS" inverse="true">
		<key column="CAMPEONATO_IDCAMPEONATO"/>
		<many-to-many class="Controler.CTR_clube" column="IDCLUBE"/>
	</set>
    </class>
</hibernate-mapping>

XML ETAPA

<?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="Controler.CTR_etapa" table="ETAPA">
	<id name="idEtapa" column="IDETAPA">
        	<generator class="increment"/>
        </id>

        <property name="nome" column="NOME"/>
        <property name="cidade" column="CIDADE"/>
	<property name="estado" column="ESTADO"/>
	<property name="dtEtapa" column="DATAETAPA" />
	<property name="hrEtapa" column="HORAETAPA"/>
	
	<set name="Provas" inverse="true" lazy="true">
		<key column="PROVA_IDPROVA" not-null="true"/>
		<one-to-many class="Controler.CTR_prova"/>
	</set>
	
	<many-to-one name="Campeonato" class="Controler.CTR_campeonato" column="IDCAMPEONATO"/>	
    </class>
</hibernate-mapping>

POJO CAMPEONATO

package Controler;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class CTR_campeonato implements Serializable{
   private String nome, dtCampeonato;
   private int idCampeonato;
   private Set Etapas = new HashSet();
   private Set Clubes = new HashSet();
   private Set Indices = new HashSet();

    public CTR_campeonato()
    { }

    //Méodos Sets e Gets

POJO ETAPA

[code]
package Controler;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class CTR_etapa implements Serializable{
//declarando as variaveis
private String nome, cidade, estado, dtEtapa, hrEtapa;
private int idEtapa;
private Controler.CTR_campeonato Campeonato;
private Set Provas = new HashSet() ;

//Métodos Sets e Gets

}[/code]

Meu problema está sendo inserir as etapas. Pois não sei como definir a chave estrangeira na hora de inserir-las.

Obrigado!!

oi!

pegue um objeto do tipo Campeonato e sete ele na sua Etapa, antes de gravar a Etapa, o Campeonato ja deve ter um ID setado, se nao voce vai receber TransientObjectException.

abracos

Hibernate: /* criteria query */ select this_.IDCAMPEONATO as IDCAMPEO1_0_, this_.NOME as NOME2_0_, this_.DATACAMPEONATO as DATACAMP3_2_0_ from CAMPEONATO this_ Passou por Aki Hibernate: /* insert Controler.CTR_etapa */ insert into ETAPA (NOME, CIDADE, ESTADO, DATAETAPA, HORAETAPA, Campeonato, IDETAPA) values (?, ?, ?, ?, ?, ?, ?) 2008-08-26 22:06:35,109 WARN hibernate.util.JDBCExceptionReporter SQL Error: 335544569, SQLState: HY000 2008-08-26 22:06:35,109 ERROR hibernate.util.JDBCExceptionReporter GDS Exception. 335544569. Dynamic SQL Error SQL error code = -206 Column unknown HORAETAPA At line 1, column 86 2008-08-26 22:06:35,109 WARN hibernate.util.JDBCExceptionReporter SQL Error: 335544569, SQLState: HY000 2008-08-26 22:06:35,109 ERROR hibernate.util.JDBCExceptionReporter GDS Exception. 335544569. Dynamic SQL Error SQL error code = -206 Column unknown HORAETAPA At line 1, column 86 2008-08-26 22:06:35,109 ERROR event.def.AbstractFlushingEventListener Could not synchronize database state with session org.hibernate.exception.GenericJDBCException: could not insert: [Controler.CTR_etapa] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82) org.hibernate.exception.GenericJDBCException: could not insert: [Controler.CTR_etapa] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70) at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:82) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:70) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:1869) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:46) at org.hibernate.persister.entity.BasicEntityPersister.insert(BasicEntityPersister.java:2200) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:239)

Fiz isso, porém está dando este erro.

Vou postar tb o código da ação do botão gravar

[code]
private void BTgravarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
List Campeonatos = DAO_campeonato.listarCampeonatos();
camp = new CTR_campeonato();
for (Object o : Campeonatos){
camp = (CTR_campeonato)o;
String x = jCombocampeonato.getSelectedItem().toString();
if(camp.getNome().equals(x)){
System.out.println(“Passou por Aki”);
etapa = new CTR_etapa();
etapa.setCampeonato(camp);
etapa.setIdEtapa(0); //Chave primaria é auto-increment
etapa.setNome(JTFnome.getText());
etapa.setDtEtapa(JTFdata.getText());
etapa.setHrEtapa(JTFhora.getText());
etapa.setCidade(JTFcidade.getText());
etapa.setEstado(JTFestado.getText());

            DAO_etapa.salvar(etapa);
            break;
            
        }
        
   }

}[/code]

Faço a minima ideia do que seja isso, caso seja necessário eu posto o código da Classe DAO

Muito Obrigado Pela Força!!!

Problema resolvido…

Abandonei esse tal de hibernate que tava me dando dor de cabeça e passei a usar o JDBC conectarndo com SQL Puro. Graças a isso meu sistema está quase pronto

T+