Hibernate: Problemas com cascade para persistir relacionamento parent-child

Olá pessoal,

Tenho um relacionamento entre um vôo e os passageiros deste vôo. Esse relacionamento pode, por exemplo, ser mapeado como descrito abaixo

@Entity
public class Voo {
   //...
   @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE},
			   mappedBy = "voo")	
   private Set<Passageiro> passageiros = new HashSet<Passageiro>();

   //...
}

@Entity
public class Passageiro {
   //...
   @ManyToOne
   @JoinColumn(name="voo_id", nullable=false)
   private Voo voo;
   //...
}

Estou usando um filtro para implementar o padrão "open session in view" e DAOs genéricos conforme demonstrado em http://www.hibernate.org/328.html.

Pelo que sei, usando CascadeType.PERSIST e CascadeType.MERGE, ao adicionar um novo passageiro na lista de passageiros de um Voo, eu não precisaria chamar save() duas vezes, uma para a entidade da classe Voo e outra para o passageiro. Uma vez somente, para o objeto da classe Voo seria o suficiente, certo?

Estou fazendo algo mais ou menos assim em uma classe de negócio:

@Override
public boolean adicionarPassageiro(long vooId, Passageiro p) {
	Voo voo = selecionar(vooId);		
	if(voo.addPassageiro(p))
		return salvar(voo) != null;
	else return false;		
}

@Override
public Voo selecionar(long id) {
	return vooDAO.findById(id, true);
}

@Override
public Voo salvar(Voo voo) {
	return vooDAO.makePersistent(voo);
}

E na classe Voo garanto o relacionamento bidirecional fazendo

public boolean addPassageiro(Passageiro passageiro) {
	passageiro.setVoo(this);
	return passageiros.add(passageiro);
}

Acontece que quando utilizo o método adicionarPassageiro(long vooId, Passageiro p), o passageiro não é persistido.
Já debuguei tudo e não acho o erro… A transação está sendo corretamente comitada quando o request HTTP volta para o filtro, conforme o “open session in view”, mas mesmo olhando no console do Eclipse, nenhuma sentença SQL de insert ou update é gerada pelo Hibernate.

Onde posso estar errando?

Obrigado e um abraço!

Pessoal, me desculpem por dar um “up” no tópico. Fiz a besteira de postar isso no domingo e óbviamente niguém viu e agora o tópico ficou “lá prá baixo”. Se alguém puder me ajudar…

Obrigado!

Ola, isto realmente deveria funcionar desde que o seu objeto passageiro esteje relacionado a sessão. Desde que o mesmo seja um objeto carregado pelo hibernate.
Este é o seu caso? Caso não seja, não vai funfar mesmo.

[quote=ovelha]Ola, isto realmente deveria funcionar desde que o seu objeto passageiro esteje relacionado a sessão. Desde que o mesmo seja um objeto carregado pelo hibernate.
Este é o seu caso? Caso não seja, não vai funfar mesmo.[/quote]

O objeto Voo está relacionado à uma sessão e foi carregado pelo Hibernate. O objeto da classe Passageiro acabou de ser criado.
Pior que tenho certeza que fiz como descrito no “Java Persistence With Hibernate”, não consigo achar o que pode estar errado…

Cara você pode receber na sua classe somente o VOO, exemplo:


	@Override  
	public boolean adicionarPassageiro(Voo voo) {
		//Carregar o Voo já existente
		Voo vooDB = this.dao.load(voo.getId());
		
		
		//Ia iniciar uma lista inteira, porém estamos passando apenas 1 passageiro.
		//List<Passageiros> passageirosList = new ArrayList<Passageiros>();
		
		//Verificar os passageiros
		for(int i = 0; i < voo.getPassageiros().size; i++){
			//buscar o passageiro que já está no banco
			Passageiro passageiroDB = this.daoPassageiro.load(voo.getPassageiros().get(i).getId());
			
			//Caso eu fosse salvar todos os passageiros que viessem na lista, mas estamos recebendo apenas 1
			//passageirosList.add(passageiroDB);
			
			//Criar um médoto que recebe o passageiro
			vooDB.addPassageiro(passageiroDB);
		}
		
		//chamar o method de update no seu voo
		this.dao.update(vooDB);
		
	   
	}