Mapear um Set no Hibernate

7 respostas
M

Pessoal do Fórum,

Estou com um problema ao mapear um set no hibernate. Possuo um mapeamento Noticia e outro Paragrafo, ou seja, uma noticia possui diversos paragrafos. Porem na tabela paragrafo alem dos campos id, idFoto e texto eu possuo um campo idNoticia, é justamente este campo que não estou conseguindo obter. Na hora da inserção ocorre tudo certo, porém o campo idNoticia está com valor NULL, abaixo esta os dois relacionamentos

NOTICIA

<hibernate-mapping>

 <class name="br.com.marcelo.noticia.Noticia ">
 
  <!-- Identificador da classe -->

 <id name="id">
   <generator class="increment"/>
  </id>
 
  <!-- Propriedades da classe -->
    <many-to-one name="idFoto" class="br.com.marcelo.foto.Foto" column="idFoto" unique="true" cascade="all"/>
   
    <property name="idUsuario"/>
    <property name="idCategoria"/>
    <property name="titulo"/>
    <property name="texto"/>
    <property name="dataEntrada"/>
    <property name="autor"/>
    <property name="fonte"/>
    <property name="posicao"/>
    <property name="status"/>
 
  <!-- Relacionamento da classe -->

     <set name="paragrafos" table="paragrafo" inverse="true" cascade="all" >
        <key column="idNoticia"/>
        <one-to-many class="br.com.marcelo.noticia.Paragrafo"/>
    </set>
 
 </class>

</hibernate-mapping>

PARAGRAFO

<hibernate-mapping>

      <class name="br.com.marcelo.noticia.Paragrafo">

        <id name="id">
          <generator class="increment"/>
        </id>
       
        <many-to-one name="idFoto" class="br.com.marcelo.foto.Foto" column="idFoto" unique="true" cascade="all"/>
       
         <many-to-one cascade="all"
            name="noticia"
            class="br.com.marcelo.noticia.Noticia"
            column="idNoticia"/>
       
        <property name="texto"/>

      

      </class>
     
</hibernate-mapping>

Obg;)

7 Respostas

nilolima

Amigo que campo é esse idNoticia ele tá em qual tabela? Se tiver na tabela de paragrafo vc provavelmente está esquencendo de ligar o paragrafo a uma noticia. Vc ta fazendo isso?

Noticia n = new Noticia;
n.setTitulo("teste");
.
.
.
Paragrafo p = new Paragrafo();
p.setNoticia(n);

Se não resolver passa mais dados.

Valeu

T

Acho que o mais provável é ele está fazendo um

noticia.getParagrafos().add(paragrafo);

Ou tu faz como o nilolima disse ou tu põe o inverse=“false”

M

O campo IdNoticia está na tabela paragrafo, os outros campos da tabela eu consigo inseir, apenas falta o campo idNoticia, que seria justamente estaria relacionado com a noticia.

Classe Noticia

public void setId( int id ) { this.id = id; }
....	
public void setParagrafos(Set paragrafos) { this.paragrafos = paragrafos; }

public int getId() { return this.id; }
.....	
public Set getParagrafos() {	return this.paragrafos;	}

Classe Paragrafo

* o campo id é auto-increment
* o campo idNoticia é referente ao id noticia 

public void setId(int id) {	this.id = id; } 
public void setIdNoticia(int idNoticia) {	this.idNoticia = idNoticia; }
...	
public void setNoticia( Noticia noticia ){ this.noticia = noticia; }
	
	
public int getId() {return (this.id); } 
public int getIdNoticia() {	return (this.idNoticia); }
...
public Noticia getNoticia(){ return ( this.noticia ); }

Codigo de Teste

List paragrafos = new ArrayList();
Noticia noticia = new Noticia();
Paragrafo paragrafo = new Paragrafo();
				
noticia.setTitulo( "Noticia titulo" );
noticia.setTexto( "Texto Texto Texto " );
....		
			
paragrafo.setTexto( " Texto Texto Texto Texto " );
paragrafos .add( paragrafo );						
									
noticia.setParagrafos( new HashSet( lista ) );

sessao.save( noticia );

Sera que e algum erro na forma que estou inserindo, ou no mapeamento?

nilolima

Cara aqui tu ta lidando com o modelo OO, lá no modelo relacional o relaciomaneto é implentado com chaves estrangeiras, aqui é diferente.

Noticia tem paragrafos, um relacionamento um para muitos. Logo isso gera duas classes.
Noticia.java e Paragrafo.java até ai vc já sabia né? :smiley:
Bom, o seu erro foi só em usar uma chave estrangeira na class Paragrafo quando deveria usar uma referencia para a class noticia.
Vc fez legal na parte de noticia, uma noticia tem uym conjunto de Paragrafos.
Mas Paragrafos tem uma noticia. Sacou?

Logo tira essa propriedade IdNoticia da class paragrafo e coloca uma referencia para noticia. Espero ter ajudado.

Le o material de Mauricio Linhares sobre Hibernate, tem aqui no grupo mesmo.

Boa sorte

M

Olá Nilo,

Estou iniciando no Hibernate, por isso ainda estou com muita dificuldade, no que diz relação ao mapeamento das classes, comecei estudando pelo o tutorial do Maurício. Porém, ainda não consegui fazer esse danado fazer referencia a classe noticia, de que maneira eu poderia fazer isso??
Valeu

T

Muda pra inverse=“false”. E se quiser deletar em cascata também: cascade=“all, delete-orphans”.

M

Valeu pela ajuda, agora deu certo!!! Complicado esse negócio do mapeamento neh
Flw

Criado 17 de setembro de 2006
Ultima resposta 18 de set. de 2006
Respostas 7
Participantes 3