Erro em relacionamento @ManyToOne

Bom dia pessoal, estou tenho um problema ridículo em um CRUD. Na minha aplicação eu tenho uma tabela de pessoafisica e tenho atributos raca, cor dos olhos e cor de cabelo. Não são obrigatórios esses atributos. Estou usando hibernate com JPA, JSF 2 para as telas. Mas na hora de gravar o registro recebo a mensagem:

javax.servlet.ServletException: javax.el.PropertyNotFoundException: /pessoasfisicas.xhtml @226,111 value="#{pessoaFisicaBean.pessoaFisica.raca.id}": Target Unreachable, ‘null’ returned null.

Se é um atributo opcional, porque ele esta pedindo um valor para o ID da raca? (também cor de cabelo e cor dos olhos está reclamando).

Segue minhas classes e o pedaço do fonte xhtml;

@Entity
public class PessoaFisica {

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

@Column(nullable = true)
private int status = 0;

@Column(nullable = true, length = 120)
private String nmPessoaFisica;

@Column(nullable = true, length = 60)
private String nmApelido;

@Column(nullable = true, length = 120)
private String nmPai;

@Column(nullable = true, length = 120)
private String nmMae;

@Column(nullable = true, length = 120)
private String email;

@Column(nullable = true, length = 1)
private String sexo;

@Column(nullable = true)
private int nuDependentes = 0;

@Column(nullable = true)
@Temporal(TemporalType.DATE)
private Date dtNascimento;

@Column(nullable = true, length = 1)
private String estadoCivil;

@Column(nullable = true, length = 11)
private String cpf;

@Column(nullable = true, length = 20)
private String Rg;

@Column(nullable = true, length = 20)
private String orgaoExpRg;

@Column(nullable = true, length = 60)
private String naturalidade;

@Column(nullable = true)
private float altura = 0;

@Column(nullable = true)
private float peso = 0;

@Column(nullable = true, length = 20)
private String cnh;

@Column(nullable = true, length = 20)
private String categoriaCnh;

@Column(nullable = true, length = 3)
private String tipoSangue;

@Column(nullable = true, length = 20)
private String tituloEleitor;

@Column(nullable = true, length = 20)
private boolean inMorador = true;

@Column(nullable = true, length = 5)
private String zona;

@Column(nullable = true, length = 10)
private String secao;

@ManyToOne(optional=true, cascade=CascadeType.ALL)
private Raca raca;

@ManyToOne(optional=true, cascade=CascadeType.ALL)
private CorOlho corOlho;

@ManyToOne(optional=true, cascade=CascadeType.ALL)
private CorCabelo corCabelo;

public PessoaFisica() {
    this.setCorOlho(new CorOlho());
    this.setCorCabelo(new CorCabelo());
    this.setRaca(new Raca());
}

… getter e setter
}

<h:selectOneMenu id=“raca” styleClass=“form-control” value="#{pessoaFisicaBean.pessoaFisica.raca.id}">
<f:selectItem itemLabel="" itemValue=""/>
<f:selectItems
value="#{racaBean.listaRaca}“
var=“vRaca"
itemLabel=”#{vRaca.nmRaca}“
itemValue=”#{vRaca.id}”/>
</h:selectOneMenu>

Valeu pela ajuda

Faltou um pouco de conhecimento sobre JSF aí.

Primeiro ponto, aprenda a usar as tags code para postar código, fica muito mais agradável de ler.

Agora indo ao problema, você tem na sua página a seguinte EL:"#{pessoaFisicaBean.pessoaFisica.raca.id}"E o erro diz que esse atributo (alvo/target) está inalcançável (unreachable).

Resumindo, ou esse atributo não existe, ou alguém nessa cadeia está nulo (ou talvez não possua método get)

Se pessoaFisicaBean não estiver nulo, verifique pessoaFisica
Se pessoaFisica não estiver nulo, verifique raca

e por aí vai :slight_smile:

Obrigado por responder.

Quais são as tags/

Olha o meu construtor de pessoaFisica:

public PessoaFisica() {
this.setCorOlho(new CorOlho());
this.setCorCabelo(new CorCabelo());
this.setRaca(new Raca());
}

Ele existe sim.

seu código deve ficar entre as tags

Você tem que ver se a cadeia inteira está instanciada e se tem métodos get/set

Mas estão também, todos os atributos da classe possuem getters e setters.

É a coisa mais comum nos meus 30 anos de programação. Um grid onde vc inclui, altera e exclui.

Quando você entra na tela, com a tabela vazia e vai incluir a primeira vez funciona de boa. E o erro acontece justamente nos atributos que possuem FK.