Problema JPA OneToOne bidirecional

Java

19/05/2015

Estou com um problema ao criar um relacionamento um para um com JPA.

Criei duas classes Pessoa e Endereco. Pessoa tem um Endereco e Endereco também tem uma Pessoa mas na hora de gravar no banco de dados a tabela endereços não está criando a chave estrangeira que vem de pessoas. Abaixo as três classes, alguém poderia ajudar?

@Entity
@Table(name="enderecos")
public class Endereco {

    @Id
    @GeneratedValue
    private long id;
    private String nomeRua;
    @OneToOne(mappedBy="endereco")
    private Pessoa pessoa;

    /**
     * @return the id
     */
    public long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }

    /**
     * @return the nomeRua
     */
    public String getNomeRua() {
        return nomeRua;
    }

    /**
     * @param nomeRua the nomeRua to set
     */
    public void setNomeRua(String nomeRua) {
        this.nomeRua = nomeRua;
    }

    /**
     * @return the pessoa
     */
    public Pessoa getPessoa() {
        return pessoa;
    }

    /**
     * @param pessoa the pessoa to set
     */
    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
}


@Entity
@Table(name="pessoas")
public class Pessoa {
    
    @Id
    @GeneratedValue
    private long id;
    private String nomePessoa;
    @OneToOne
    private Endereco endereco;

    /**
     * @return the id
     */
    public long getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }

    /**
     * @return the nomePessoa
     */
    public String getNomePessoa() {
        return nomePessoa;
    }

    /**
     * @param nomePessoa the nomePessoa to set
     */
    public void setNomePessoa(String nomePessoa) {
        this.nomePessoa = nomePessoa;
    }

    /**
     * @return the endereco
     */
    public Endereco getEndereco() {
        return endereco;
    }

    /**
     * @param endereco the endereco to set
     */
    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}


public class Executa {
    
    public static void main(String[] args){
        
        EntityManager manager = JPAUtil.getEntityManager();
        Pessoa pessoa = new Pessoa();
        Endereco endereco = new Endereco();
        
        pessoa.setNomePessoa("Pedro Paulo");
        endereco.setNomeRua("Massaharu Tanigushi");
        
        pessoa.setEndereco(endereco);
        endereco.setPessoa(pessoa);
        
        manager.getTransaction().begin();
        manager.persist(pessoa);
        manager.persist(endereco);
        manager.getTransaction().commit();
        manager.close();
        
        System.out.println("Gravado com sucesso");
    }
}
Paulo Henrique

Paulo Henrique

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

19/05/2015

Mude seu método execute() para o método abaixo e teste novamente:

public class Executa {
     
    public static void main(String[] args){
         
        EntityManager manager = JPAUtil.getEntityManager();
        Pessoa pessoa = new Pessoa();
        Endereco endereco = new Endereco();
         
        pessoa.setNomePessoa("Pedro Paulo");
        endereco.setNomeRua("Massaharu Tanigushi");
         
        pessoa.setEndereco(endereco);
        endereco.setPessoa(pessoa);
         
        manager.getTransaction().begin();
        pessoa = manager.persist(pessoa);
        endereco.setPessoa(pessoa);
        manager.persist(endereco);
        manager.getTransaction().commit();
        manager.close();
         
        System.out.println("Gravado com sucesso");
    }
}
GOSTEI 0
Paulo Henrique

Paulo Henrique

19/05/2015

Olá Ronaldo obrigado pela resposta.
Então ele nem deixa pessoa receber manager.persist(pessoa), dá erro logo de cara, tipos incompatíveis.
GOSTEI 0
Paulo Henrique

Paulo Henrique

19/05/2015

Obrigado mais uma vez. Consegui resolver.
Eu estava confundindo as coisas se eu quisesse colocar uma chave estrangeira nas duas tabelas eu teria que remover o mappedBy mas não era esse o caso. Valeu pela ajuda.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

19/05/2015

Tudo bem, disponha.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

19/05/2015

Tudo bem, disponha.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

19/05/2015

Tudo bem, disponha.
GOSTEI 0
POSTAR