ManyToOne bidirecional

Estou fazendo o cadastro de produtores e seus dependentes. Com isso, utilizei a relação OneToMany e ManyToOne.

package br.unemat.digera.models;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@ManagedBean
@Entity
public class Produtor {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

private String nome;
private String cpf;
private String sexo;
private Date dataNasc;
private String estadoCivil;
private String escolaridade;
private BigDecimal renda;
private String profissao;
private String fone;

@OneToMany(mappedBy="produtores")
private List<Dependente> dependentes;

public Produtor(){}

public Produtor(Integer id){
	this.id = id;
}

public Integer getId() {
	return id;
}
public void setId(Integer id) {
	this.id = id;
}
public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getCpf() {
	return cpf;
}
public void setCpf(String cpf) {
	this.cpf = cpf;
}
public String getSexo() {
	return sexo;
}
public void setSexo(String sexo) {
	this.sexo = sexo;
}
public Date getDataNasc() {
	return dataNasc;
}
public void setDataNasc(Date dataNasc) {
	this.dataNasc = dataNasc;
}
public String getEstadoCivil() {
	return estadoCivil;
}
public void setEstadoCivil(String estadoCivil) {
	this.estadoCivil = estadoCivil;
}
public String getEscolaridade() {
	return escolaridade;
}
public void setEscolaridade(String escolaridade) {
	this.escolaridade = escolaridade;
}
public BigDecimal getRenda() {
	return renda;
}
public void setRenda(BigDecimal renda) {
	this.renda = renda;
}
public String getProfissao() {
	return profissao;
}
public void setProfissao(String profissao) {
	this.profissao = profissao;
}
public String getFone() {
	return fone;
}
public void setFone(String fone) {
	this.fone = fone;
}

public List<Dependente> getDependentes() {
	return dependentes;
}

public void setDependentes(List<Dependente> dependentes) {
	this.dependentes = dependentes;
}

@Override
public String toString() {
	return "Produtor [id=" + id + ", nome=" + nome + ", cpf=" + cpf + ", sexo=" + sexo + ", dataNasc=" + dataNasc
			+ ", estadoCivil=" + estadoCivil + ", escolaridade=" + escolaridade + ", renda=" + renda
			+ ", profissao=" + profissao + ", fone=" + fone + ", dependentes=" + dependentes + "]";
    }

}

package br.unemat.digera.models;

import java.util.Date;

import javax.faces.bean.ManagedBean;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@ManagedBean
@Entity
public class Dependente {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

private String nome;
private Date dataNasc;
private String grauParente;
private String sexo;

@ManyToOne
private Produtor produtores;

public Integer getId() {
	return id;
}

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

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public Date getDataNasc() {
	return dataNasc;
}

public void setDataNasc(Date dataNasc) {
	this.dataNasc = dataNasc;
}

public String getGrauParente() {
	return grauParente;
}

public void setGrauParente(String grauParente) {
	this.grauParente = grauParente;
}

public String getSexo() {
	return sexo;
}

public void setSexo(String sexo) {
	this.sexo = sexo;
}

public Produtor getProdutores() {
	return produtores;
}

public void setProdutores(Produtor produtores) {
	this.produtores = produtores;
}

@Override
public String toString() {
	return "Dependente [id=" + id + ", nome=" + nome + ", dataNasc=" + dataNasc + ", grauParente=" + grauParente
			+ ", sexo=" + sexo + ", produtores=" + produtores + "]";
}

}

Utilizei esse Bean para salvar os dependentes. Estou conseguindo salvar os produtores normalmente, utilizando xhtml com Primefaces. Porem, para salvar o dependente e ligar o Id do produtor ele não está identificando o Id, e deixa como nulo.

package br.unemat.digera.beans;

import java.util.List;

import javax.enterprise.inject.Model;
import javax.inject.Inject;
import javax.transaction.Transactional;

import br.unemat.digera.daos.DependenteDao;
import br.unemat.digera.daos.ProdutorDao;
import br.unemat.digera.models.Dependente;
import br.unemat.digera.models.Produtor;

@Model
public class AdminDependenteBean {

private Dependente dependente = new Dependente();

@Inject
private DependenteDao dao;
@Inject
private ProdutorDao produtorDao;

@Transactional
public void salvar(){
	dao.salvar(dependente);
	System.out.println("Dependente: " + dependente);
}

public List<Produtor> getProdutores(){
	return produtorDao.listar();
}

public Dependente getDependente() {
	return dependente;
}

public void setDependente(Dependente dependente) {
	this.dependente = dependente;
}
}
<h:head>  

</h:head>  
  
<h:body>  
   <h:form>
<h:panelGrid columns="2" cellpadding="5">
	
	<p:outputLabel value="Nome: " />
	<p:inputText for="text" value="#{adminDependenteBean.dependente.nome}" style="width:300px"/>

    <p:outputLabel for="german" value="Data Nasc:" />
    <p:calendar id="german" value="#{adminDependenteBean.dependente.dataNasc}" locale="pt" navigator="true" pattern="dd/MM/yyyy" mask="true"/>
	
    <p:outputLabel for="grau" value="Grau de Parentesco: " />
    <p:inputMask id="grau" value="#{adminDependenteBean.dependente.grauParente}"/>
	
	<p:outputLabel for="sexo" value="Sexo:" />
    <p:selectOneRadio id="sexo" value="#{adminDependenteBean.dependente.sexo}">
        <f:selectItem itemLabel="Masculino" itemValue="Masculino" />
        <f:selectItem itemLabel="Feminino" itemValue="Feminino" />
    </p:selectOneRadio> 
	
	<p:outputLabel for="produtores" value="Produtor:" />
    <p:selectOneListbox id="produtores" value="#{adminDependenteBean.dependente.produtores}" >
        <f:selectItems var="produtor" value="#{adminDependenteBean.produtores}"
        itemValue="#{produtor.id}" itemLabel="#{produtor.nome}"/>
    </p:selectOneListbox>
	  
    <p:commandButton value="Limpar" type="reset" />
    <p:commandButton value="Cadastrar" action="#{adminDependenteBean.salvar}"/>
</h:panelGrid>
</h:form>
</h:body>  
</html>

Alguem sabe de que forma posso resolver isso??

Cada produtor tem vários dependentes e cada dependente estão conectados a apenas um produtor, isso?
O hibernate só entenderá que precisa colocar a FK do produtor em um dependente caso você:

  • Salve o produtor
  • Sete o produtor no dependente
  • Sete o dependente em questão no produtos (como pode ter mais de um, seria adicionar o mesmo)
  • Salve o dependente
  • Talvez seja necessário realizar update no produtor.