Li no forum aqui do GUJ diversos posts sobre problema de relacionamento OneToOne com save bidirecional.
Vejam minhas classes.
public class Usuario {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "IDUSUARIO")
private long idUsuario;
@Basic(optional = false)
@Column(name = "USUARIO")
@Size(max=20)
private String usuario;
@Basic(optional = false)
@Column(name = "SENHA")
@Size(max=20)
private String senha;
@OneToOne(optional=false)
@Cascade({CascadeType.ALL})
@PrimaryKeyJoinColumn
private Pessoa pessoa;
...
}
public class Pessoa {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "IDPESSOA")
private long idPessoa;
@Basic(optional = false)
@Column(name = "NOME")
@Size(max=50)
private String nome;
@Basic(optional = false)
@Enumerated(EnumType.ORDINAL)
@Column(name = "SEXO")
private Sexo sexo;
@Column(name = "NASCIMENTO")
@Basic(optional = false)
@Temporal(TemporalType.DATE)
private Date nascimento;
@JoinColumn(name = "ENDERECO", referencedColumnName = "IDENDERECO")
@ManyToOne(optional=true)
@Cascade({CascadeType.ALL})
private Endereco endereco;
@OneToOne(mappedBy="pessoa")
@Basic(optional = false)
private Usuario usuario;
...
}
Especificamente nos relacionamentos separados entre usuario e pessoa.
Nos meus testes unitários:
@Test
public void testGetByIdTmp() {
Usuario u = new Usuario();
u.setUsuario("lm.moreira");
u.setSenha("abc");
Pessoa p = new Pessoa();
p.setNome("Leonardo Machado Moreira");
p.setNascimento(new Date());
p.setSexo(Sexo.MASCULINO);
p.setUsuario(u);
genericDao.save(p);
}
@Test
public void testGetById() {
Pessoa p = new Pessoa();
p.setNome("Leonardo Machado Moreira");
p.setNascimento(new Date());
p.setSexo(Sexo.MASCULINO);
Usuario u = new Usuario();
u.setUsuario("lm.moreira");
u.setSenha("abc");
u.setPessoa(p);
genericDao.save(u);
}
Quando executado e a entidade usuario é persistida ele cria a pessoa automaticamente, obviamente quando faço o set, porém o contrário nao é verdadeiro. Quando faço o save na classe pessoa como no primeiro teste unitário ele não dá erro porém não persiste o usuário e a pessoa fica sem usuário.
Quando na classe pessoa eu adiciono a anotação @MapsId, pra falar da dependencia com a chave primaria de usuario ele funciona, a persistencia de pessoa é feita e o usuário também, porém a persistencia de usuário, que antes funcionava não funciona mais pois ele disse que a chave primária esta null.
Vejam minha idéia nao é deixar a pessoa dependente da persistencia de um usuário como com a anotação GenericGenerator, mas gostaria apenas que a persistencia fosse bidirecional, isto é possivel?
Agradeço