[Resolvido] OneToOne só seta de um lado

Tenho as seguintes entidades:

class Usuario { private PessoaFisica pf; //... @OneToOne public PessoaFisica getPf() { //..

class PessoaFisica { private Usuario usuario; //... @OneToOne public Usuario getUsuario() { //..
e desta relação bidirecional eu esperava que ao dar um
usuario.setPf(novaPf);
ele soubesse settar o atributo em ambos os lados, porém desta maneira só é possível fazer um
usuario.getPf();
pois um pf.getUsuario() retorna null.

Como eu faço pra ter o comportamento que desejo?

falta definir o dono do relacionamento.
mappedBy

@OneToOne(mappedBy = “campo”)

Você precisa colocar a lógica dentro do método setter dos dois lados (não esqueça do if para evitar recursão), por exemplo:

public void setPf(PessoaFisica pf) {
   if (pf.getUsuario() != this) {
      pf.setUsuario(this);
   }
   this.pf = pf;
}

E a mesma coisa do outro lado:

public void setUsuario(Usuario usuario) {
   if (usuario.getPf() != this) {
      usuario.setPf(this);
   }
   this.usuario = usuario;
} 

Usei o mappedBy, funciounou direitinho, valeu!

Não sabia que tinha que usar também em relações OneToOne

Legal que funcionou.

se você quer realmente aprender JPA
te diria para comprar o livro Enterprise Java Beans 3.0 ou 3.1
pois nesse livro mostra e explica detalhadamente tudo,
estou estudando por esse livro.

boa sorte em seus estudos.