Hibernate - conexão bidirecional

Ola tenho uma duvida!

Na minha aplicação tenho um relacionamento

1 X M o qual o lado 1 recebe uma lista de n

minha duvida eh

com jpa eu mapeio o relacionamento para ser bidirecional

segue o codigo das classe modelo(Entidades)

classe AquisicaoServico eh a classe com o relacionamento 1

package modelo;

import java.util.*;

import javax.persistence.*;

@SuppressWarnings("serial")
@Entity
@Table(name="obri_aquisicaoservico")
public class AquisicaoServico implements java.io.Serializable{

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id; 
	
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name="id_cliente")
	private Cli cliente;
	
	@ManyToOne(cascade = CascadeType.PERSIST)
	@JoinColumn(name="id_contratado")
	private Contratado contratado;
	
	@OneToMany(mappedBy="aquisicao", cascade= CascadeType.PERSIST )
	private List<AquisicaoIR> aquisicaoirlista;
	
	//variaveis das datas de cadastro
	private int ano;
	private int mes;
	
	
	//variaveis com informações das notas
	private int numnota;
	
	private Double valornota; 
	
	@Temporal(value=TemporalType.DATE)
	private Date emissaonota;
	
	private Double previdenciagps;
	
	private Double municipioiss;
	
	private String obsenvio;

	public int getId() {
		return id;
	}

	public Cli getCliente() {
		return cliente;
	}

	public Contratado getContratado() {
		return contratado;
	}

	public List<AquisicaoIR> getAquisicaoirlista() {
		return aquisicaoirlista;
	}

	public int getAno() {
		return ano;
	}

	public int getMes() {
		return mes;
	}

	public int getNumnota() {
		return numnota;
	}

	public Double getValornota() {
		return valornota;
	}

	public Date getEmissaonota() {
		return emissaonota;
	}

	public Double getPrevidenciagps() {
		return previdenciagps;
	}

	public Double getMunicipioiss() {
		return municipioiss;
	}

	public String getObsenvio() {
		return obsenvio;
	}

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

	public void setCliente(Cli cliente) {
		this.cliente = cliente;
	}

	public void setContratado(Contratado contratado) {
		this.contratado = contratado;
	}

	public void setAquisicaoirlista(List<AquisicaoIR> aquisicaoirlista) {
		this.aquisicaoirlista = aquisicaoirlista;
	}

	public void setAno(int ano) {
		this.ano = ano;
	}

	public void setMes(int mes) {
		this.mes = mes;
	}

	public void setNumnota(int numnota) {
		this.numnota = numnota;
	}

	public void setValornota(Double valornota) {
		this.valornota = valornota;
	}

	public void setEmissaonota(Date emissaonota) {
		this.emissaonota = emissaonota;
	}

	public void setPrevidenciagps(Double previdenciagps) {
		this.previdenciagps = previdenciagps;
	}

	public void setMunicipioiss(Double municipioiss) {
		this.municipioiss = municipioiss;
	}

	public void setObsenvio(String obsenvio) {
		this.obsenvio = obsenvio;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ano;
		result = prime
				* result
				+ ((aquisicaoirlista == null) ? 0 : aquisicaoirlista.hashCode());
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result
				+ ((contratado == null) ? 0 : contratado.hashCode());
		result = prime * result
				+ ((emissaonota == null) ? 0 : emissaonota.hashCode());
		result = prime * result + id;
		result = prime * result + mes;
		result = prime * result
				+ ((municipioiss == null) ? 0 : municipioiss.hashCode());
		result = prime * result + numnota;
		result = prime * result
				+ ((obsenvio == null) ? 0 : obsenvio.hashCode());
		result = prime * result
				+ ((previdenciagps == null) ? 0 : previdenciagps.hashCode());
		result = prime * result
				+ ((valornota == null) ? 0 : valornota.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AquisicaoServico other = (AquisicaoServico) obj;
		if (ano != other.ano)
			return false;
		if (aquisicaoirlista == null) {
			if (other.aquisicaoirlista != null)
				return false;
		} else if (!aquisicaoirlista.equals(other.aquisicaoirlista))
			return false;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (contratado == null) {
			if (other.contratado != null)
				return false;
		} else if (!contratado.equals(other.contratado))
			return false;
		if (emissaonota == null) {
			if (other.emissaonota != null)
				return false;
		} else if (!emissaonota.equals(other.emissaonota))
			return false;
		if (id != other.id)
			return false;
		if (mes != other.mes)
			return false;
		if (municipioiss == null) {
			if (other.municipioiss != null)
				return false;
		} else if (!municipioiss.equals(other.municipioiss))
			return false;
		if (numnota != other.numnota)
			return false;
		if (obsenvio == null) {
			if (other.obsenvio != null)
				return false;
		} else if (!obsenvio.equals(other.obsenvio))
			return false;
		if (previdenciagps == null) {
			if (other.previdenciagps != null)
				return false;
		} else if (!previdenciagps.equals(other.previdenciagps))
			return false;
		if (valornota == null) {
			if (other.valornota != null)
				return false;
		} else if (!valornota.equals(other.valornota))
			return false;
		return true;
	}

	
}

Classe AquisicaoIR

package modelo;

import javax.persistence.*;

@SuppressWarnings("serial")
@Entity
@Table(name="obri_aquisicao_ir")
public class AquisicaoIR implements java.io.Serializable{

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id; 
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="id_ir")
	private IR ir;
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name="id_aquisicaoservico")
	private AquisicaoServico aquisicao;
	
	private Double valor;

	public int getId() {
		return id;
	}

	public IR getIr() {
		return ir;
	}

	public AquisicaoServico getAquisicao() {
		return aquisicao;
	}

	public Double getValor() {
		return valor;
	}

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

	public void setIr(IR ir) {
		this.ir = ir;
	}

	public void setAquisicao(AquisicaoServico aquisicao) {
		this.aquisicao = aquisicao;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((aquisicao == null) ? 0 : aquisicao.hashCode());
		result = prime * result + id;
		result = prime * result + ((ir == null) ? 0 : ir.hashCode());
		result = prime * result + ((valor == null) ? 0 : valor.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AquisicaoIR other = (AquisicaoIR) obj;
		if (aquisicao == null) {
			if (other.aquisicao != null)
				return false;
		} else if (!aquisicao.equals(other.aquisicao))
			return false;
		if (id != other.id)
			return false;
		if (ir == null) {
			if (other.ir != null)
				return false;
		} else if (!ir.equals(other.ir))
			return false;
		if (valor == null) {
			if (other.valor != null)
				return false;
		} else if (!valor.equals(other.valor))
			return false;
		return true;
	}

	
	
}

a classe AquisicaoIR ela eh a Dona do relacionamento, logo que a classe com o lado M
manda na relação, a Classe AquisicaoServico possui uma lista de AquisicaoIR, no meu
cadastro estou salvando a lista. Minha pergunta é!

Se eu salvar a lista de AquisiçãoIR na classe AquisicaoServico eu preciso realizar o cadastro
na classe AquisicaoIR ou com o relacionamento sendo bidirecional o hibernate faz ele para mim.

Segui as dicas do livro do http://uaihebert.com/?p=1622
Muito Bom o livro, mas tenho essa duvida

Bom, se você está perguntando o que eu acho que está perguntando (não ficou muito claro), o Hibernate faz para você sim.

Como você marcou o relacionamento com CascadeType.PERSIST, quando você der o persist em AquisicaoServico, ele será propagado para a lista.

Exliquei um pouco confuso neh,

entao, realizei o cadastro e não foi acrescentado na tabela AquisicaoIR
o que sera q fiz errado?

Se os objetos AquisicaoIR já estiverem persistidos, acho que você precisa adicionar CascadeType.MERGE também

Aliás, como você está persistindo esse objeto? Tem como postar o método ?

Deu certo, coloquei CascadeType.ALL

só que o id da aquisição não foi adicionado a tabela
ficou o valor como null.

alguama ideia do que eu possa fazer???

Se quiser mais ajuda você vai ter que mostrar como que está persistindo o objeto. De preferência o método completo.

ok, segue as classes modelos ja estao publicadas logo acima
agora vou postar o managedBeans

package controle;

import java.util.*;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import dao.AquisicaoServicoDao;
import dao.CliDao;
import dao.ContratadoDao;
import dao.IRDao;

import modelo.AquisicaoIR;
import modelo.AquisicaoServico;
import modelo.Cli;
import modelo.Contratado;
import modelo.IR;

@ManagedBean(name="aquisicaoServicoControle")
@SessionScoped
public class AquisicaoServicoControle {

	private int tipodocumento;
	
	//obj para receber os dados para cadastro 
	private AquisicaoServico aquisicao;
	
	//lista de clientes e obj para receber o selecionado
	private List<Cli> clientes = new ArrayList<Cli>();
	private Cli cliente;
	
	//lista de contratados e obj para receber o selecionado ou quando necessario cadastrar um novo
	private List<Contratado> contratados = new ArrayList<Contratado>();
	private Contratado contratado;
	
	//lista de ir e obj para receber o cadastro um novo
	private List<IR> irlista = new ArrayList<IR>();
	private IR ir; 
	
	//lista de aquisicao adicionada e obj para receber os dados a serem add na lista
	private List<AquisicaoIR> iradicionado = new ArrayList<AquisicaoIR>();
	private AquisicaoIR aquisicaoir;
	
	//mes e ano para realizar o cadastro 
	private List<Integer> anos = new ArrayList<Integer>();
	
	public AquisicaoServicoControle(){
		tipodocumento =1;
		aquisicao = new AquisicaoServico();
		cliente = new Cli();
		contratado = new Contratado();
		ir = new IR();
		aquisicaoir = new AquisicaoIR();
		//aquisicaoir.setValor();
		anos.add(new GregorianCalendar().get(GregorianCalendar.YEAR)-2);
		anos.add(new GregorianCalendar().get(GregorianCalendar.YEAR)-1);
		anos.add(new GregorianCalendar().get(GregorianCalendar.YEAR));
		aquisicao.setAno(new GregorianCalendar().get(GregorianCalendar.YEAR)-1);
		aquisicao.setMes(new GregorianCalendar().get(GregorianCalendar.MONTH)+1);
		clientes = new CliDao().listar();
		contratados = new ContratadoDao().listar();
		irlista = new IRDao().listar();
	}

	
	public void cadastrarcontratado(ActionEvent actionEvent){
		FacesContext context = FacesContext.getCurrentInstance();  
		System.out.println("EXECUTOU");
		
		new ContratadoDao().cadastrar(this.contratado);
		contratados = new ContratadoDao().listar();
		
		
        context.addMessage(null, new FacesMessage("Cadastro Realizado com Sucesso"));  
	}
	
	public void cadastrarir(ActionEvent actionEvent){
		FacesContext context = FacesContext.getCurrentInstance();  
		System.out.println("EXECUTOU");
		
		new IRDao().cadastrar(ir);
		irlista = new IRDao().listar();
		
		
        context.addMessage(null, new FacesMessage("Cadastro Realizado com Sucesso"));  
	}
	
	public void adicionarlistair(ActionEvent actionEvent){
		FacesContext context = FacesContext.getCurrentInstance();  
		System.out.println("EXECUTOU");
		iradicionado.add(aquisicaoir);
		aquisicaoir = new AquisicaoIR();
		context.addMessage(null, new FacesMessage("Adicionado com Sucesso")); 
		
	}
	
	public void cadastraraquisicao(ActionEvent actionEvent){
		FacesContext context = FacesContext.getCurrentInstance();  
		System.out.println("EXECUTOU");
		aquisicao.setAquisicaoirlista(iradicionado);
		new AquisicaoServicoDao().cadastrar(aquisicao);
		
		new AquisicaoServicoControle();
		
		
		
		context.addMessage(null, new FacesMessage("Adicionado com Sucesso")); 
	}
	
	
	
	
	public int getTipodocumento() {
		return tipodocumento;
	}


	public AquisicaoServico getAquisicao() {
		return aquisicao;
	}

	public List<Cli> getClientes() {
		return clientes;
	}

	public Cli getCliente() {
		return cliente;
	}

	public List<Contratado> getContratados() {
		return contratados;
	}

	public Contratado getContratado() {
		return contratado;
	}

	public List<IR> getIrlista() {
		return irlista;
	}

	public IR getIr() {
		return ir;
	}

	public List<AquisicaoIR> getIradicionado() {
		return iradicionado;
	}

	public AquisicaoIR getAquisicaoir() {
		return aquisicaoir;
	}

	public List<Integer> getAnos() {
		return anos;
	}

	public void setTipodocumento(int tipodocumento) {
		this.tipodocumento = tipodocumento;
	}

	public void setAquisicao(AquisicaoServico aquisicao) {
		this.aquisicao = aquisicao;
	}

	public void setClientes(List<Cli> clientes) {
		this.clientes = clientes;
	}

	public void setCliente(Cli cliente) {
		this.cliente = cliente;
	}

	public void setContratados(List<Contratado> contratados) {
		this.contratados = contratados;
	}

	public void setContratado(Contratado contratado) {
		this.contratado = contratado;
	}

	public void setIrlista(List<IR> irlista) {
		this.irlista = irlista;
	}

	public void setIr(IR ir) {
		this.ir = ir;
	}

	public void setIradicionado(List<AquisicaoIR> iradicionado) {
		this.iradicionado = iradicionado;
	}

	public void setAquisicaoir(AquisicaoIR aquisicaoir) {
		this.aquisicaoir = aquisicaoir;
	}

	public void setAnos(List<Integer> anos) {
		this.anos = anos;
	}
	
	
	
}

os DAO

AquisicaoDAO

package dao;

import java.util.List;

import modelo.AquisicaoServico;
import org.hibernate.Criteria;
import org.hibernate.classic.Session;

import util.HibernateUtil;

public class AquisicaoServicoDao {
private Session session; 
	
	
	public void cadastrar(AquisicaoServico aquisicaoservico){
		session = HibernateUtil.getSessionFactory().openSession();
		
		try{
			session.beginTransaction();
			session.save(aquisicaoservico);
			session.getTransaction().commit();
			
		}finally{
			session.clear();
			session.close();
			
		}
	}
	
	public void alterar(AquisicaoServico aquisicaoservico){
		session = HibernateUtil.getSessionFactory().openSession();
		
		try{
			
			session.beginTransaction();
			session.saveOrUpdate(aquisicaoservico);
			session.getTransaction().commit();
			
		}finally{
			session.clear();
			session.close();
			
		}
	}
	
	public void excluir(AquisicaoServico aquisicao_servicos){
		session = HibernateUtil.getSessionFactory().openSession();
		
		try{
			
			session.beginTransaction();
			session.delete(aquisicao_servicos);
			session.getTransaction().commit();
			
		}finally{
			session.clear();
			session.close();
			
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<AquisicaoServico> listar(){
		session = HibernateUtil.getSessionFactory().openSession();
		
		try{
			Criteria cri = session.createCriteria(AquisicaoServico.class);
			return cri.list();
		}finally{
			session.clear();
			session.close();
			
		}
	}
	
		
	
}

AquisicaoIRDao

package dao;


import java.io.Serializable;
import java.util.List;

import modelo.AquisicaoIR;
import modelo.Contratado;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import util.HibernateUtil;

@SuppressWarnings( "serial" )
public class AquisicaoIRDao implements Serializable{

		
	private Session session; 

	//metodo de listar todos os clientes
	@SuppressWarnings("unchecked")
	public List <AquisicaoIR> listar(){
		 session = HibernateUtil.getSessionFactory().openSession();
		try {
			Criteria cri = session.createCriteria(Contratado.class);
					cri.addOrder(Order.asc("razao"));
					
			return cri.list();
		} finally {
		session.close();
		}
	}
	
	//metodo para buscar cliente pelo id 
	public AquisicaoIR buscar(Integer codaquisicaoir){
		 session = HibernateUtil.getSessionFactory().openSession();
			try {
				Criteria cri = session.createCriteria(Contratado.class);
						 cri.add(Restrictions.idEq(codaquisicaoir));
						 
						 return (AquisicaoIR) cri.uniqueResult();
			} finally {
			session.close();
			}
	}
	
	
}