Bidirecional @OneToOne

0 respostas
lm.moreira

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

Criado 4 de janeiro de 2011
Respostas 0
Participantes 1