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!