Exemplo one-to-many (hibernate)

5 respostas
V

Pq esse codigo nao da certo quando eu tento fazer um

pai.addFilhos(filhos);
session.save(pai);

Ele da uma exception num casting que eu nao descobri aonde eh. O atributo Pai da classe filho tem que ser mapeada tb? Segue os codigos:

Mapeamento da tabela Filho:

<hibernate-mapping>
	
	<class name="hiber.Filho" table="filho" >
		<id name="id_filho" type="long" >
			<generator class="increment"/>
		</id>

		<property name="dt_nasc"  type="java.util.Date"   not-null="true"/>
		<property name="name" 	  type="java.lang.String" not-null="true"/>
		<many-to-one name="id_pai" class="hiber.Pai" column="id_pai" />		

	</class>
	
</hibernate-mapping>

Classe filho:

import java.util.Date;

public class Filho {
	
	private Long 	id_filho;
	private Long 	id_pai;
	private String	name;
	private Date  	dt_nasc;
	private Pai 	pai;
		
	public Filho()
	{	}

	public Filho( Long id_filho, Long id_pai, Date dt_nasc, String name, Pai pai) 
	{
		this.dt_nasc 	= dt_nasc;
		this.id_filho 	= id_filho;
		this.id_pai 	= id_pai;
		this.dt_nasc 	= dt_nasc;
		this.pai		= pai;
	}
	
	public void setDt_nasc(Date sVal) 	{ dt_nasc = sVal; }
	public void setId_filho(Long sVal) 	{ id_filho = sVal; }
	public void setId_pai(Long sVal) 	{ id_pai = sVal; }
	public void setName(String sVal)  	{ name = sVal; }
	public void setPai(Pai sVal)  		{ pai = sVal; }
	
	public Date getDt_nasc() 	{ return dt_nasc; }
	public Long getId_filho() 	{ return id_filho;}
	public Long getId_pai() 	{ return id_pai;}
	public String getName()  	{ return name;}
	public Pai getPai()  		{ return pai;}
		
}

Mapeamento da tabela pai:

<hibernate-mapping>
	
	<class name="hiber.Pai" table="pai" >
		<id name="id_pai" type="long">
			<generator class="increment"/>
		</id>

		<property name="Dt_nasc" not-null="true" type="java.util.Date"/>
		<property name="name" not-null="true" type="java.lang.String"/>

		<set name="filhos" lazy="true" inverse="true" cascade="all-delete-orphan">
		        <key column="id_pai" />
		        <one-to-many class="hiber.Filho" />
		</set>

		
	</class>
	
</hibernate-mapping>

Classe pai:

package hiber;

import java.util.*;  
 
public class Pai {
	
	private Long 	id_pai;
	private String  name;
	private Date 	dt_nasc;
	private Set 	filhos;
	
	public Pai()
	{	}

	public Pai( Long id_pai, Date dt_nasc, String name,  Set filhos ) 
	{
		this.id_pai = id_pai;
		this.name = name;
		this.dt_nasc = dt_nasc; 
		this.filhos = filhos; 
	}
	
	public Long getId_pai() 			{ return this.id_pai; 	}
	public Date getDt_nasc() 			{ return this.dt_nasc; 	}
	public String getName() 			{ return this.name; 	}
	public Set getFilhos()				{ return this.filhos;	}
	
	
	public void addFilhos(Filho filho)
	{
		filho.setPai(this);
		this.filhos.add(filho);
	}
	
	public void setId_pai(Long id_pai) 		{ this.id_pai = id_pai; 	}
	public void setDt_nasc(Date dt_nasc)	{ this.dt_nasc = dt_nasc; 	}
	public void setName(String name) 		{ this.name = name; 		}
	public void setFilhos(Set filhos) 		{ this.filhos = filhos; 	}
	
}

5 Respostas

T

“victorpinto”:

Ele da uma exception num casting que eu nao descobri aonde eh.

Victor,

sugiro q vc descubra onde aconteceu o erro pra depois analisá-lo…

Fallow.

V

O erro de casting rola no session.find . Aind anao descobri pq, mas quando coloca um find mais simples do tipo (from Pai), ele nao da erro. E o que falta pra dar certo a inclusao eh no mapeamento do filho :
Ao inves disso:

Deve-se colocar no name o campo na tabela filho que representa o pai, no nosso caso :

Fazendo essas alterações o exemplo funciona perfeitamente.

T

Certo.

O q seria um session.find() não-simples para vc? Não entendi…

V

assim ele nao estava funcionando

e se colocar assim ele funciona:

T

Acho q tah dando erro de casting pq vc colocou entre aspas (“1”)… ele
entende como String…

Tente tirar as aspas…

Criado 27 de junho de 2005
Ultima resposta 30 de jun. de 2005
Respostas 5
Participantes 2