OneToOne Bidirecional

Saudacoes, é o seguinte estou aprendendo como usar o hibernate e seus relacionamentos, entao criei algumas classe simples para testes, sao elas:

Classe Pessoa
Classe Celular

Sendo que

Pessoa <–OneToOne–> Celular

Segue as classes

Pessoa

@Entity
public class Pessoa_1_1_Bi implements Serializable {
    private static final long serialVersionUID = -923780075447341496L;

	
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String nome;
 
    @OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name="id_celular")
    private Celular_1_1_Bi celular;

    public Pessoa_1_1_Bi() {
    }
 
    public Pessoa_1_1_Bi(String nome, Celular_1_1_Bi celular) {
    	this.setNome(nome);
        this.setCelular(celular);
    }

   // Get e Set

}

Celular

@Entity
public class Celular_1_1_Bi implements Serializable {
    private static final long serialVersionUID = -5598157210546580533L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private int number;

    @OneToOne(mappedBy="celular", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    private Pessoa_1_1_Bi pessoa = new Pessoa_1_1_Bi();
    
    public Celular_1_1_Bi() {
    }
 
    public Celular_1_1_Bi(int numero) {
        this.number = numero;
    }

    // Get e Set
}

Criada as tabelas pelo Hibernate carro as tabelas com alguns dados

Popula tabelas

			Pessoa_1_1_Bi p;
			Celular_1_1_Bi c;

			c = new Celular_1_1_Bi(11111111);
			p = new Pessoa_1_1_Bi("Pessoa 1", c);
			em.merge(p);

			c = new Celular_1_1_Bi(22222222);
			p = new Pessoa_1_1_Bi("Pessoa 2", c);
			em.persist(p);

			c = new Celular_1_1_Bi();
			p = new Pessoa_1_1_Bi("Pessoa 3", c);
			em.persist(p);

			p = new Pessoa_1_1_Bi("Pessoa 4", null);
			em.persist(p);

Ate aqui sem erros

O problema esta na hora que eu tento carregar as instancias com o resultado vindo do banco, segue o codigo.

	public static void selectCelular_1_n_Bi(){
		em.getTransaction().begin();

		Query q = em.createQuery("select q from " + Celular_1_1_Bi.class.getName() + " q ");

		List<Celular_1_1_Bi> l = (List<Celular_1_1_Bi>) q.getResultList();

		for (Celular_1_1_Bi p : l) {
			System.out.printf("\n");
			System.out.printf("Id_Pessoa: " + p.getPessoa().getId() + "\n");
			System.out.printf("Nome: " + p.getPessoa().getNome() + "\n");
			System.out.printf("Celular: " + p.getNumber() + "\n");
			System.out.printf("--------------------\n");
			
		}
	}

O erro acontece quando tento imprimir a linha com o Id e nome da pessoa

Neste momento ele me fala que a Pessoa esta null, ou seja ele nao carregou a classe pessoa, so que como podem ver, a definicao das classe esta Bidirecional, uma classe deveria enchergar a outra, ou nao??

Esta é minha duvida, se eu chamar pelo classe Celular (por ser bidirecional) a classe pessoa deveria ser encontrada?? Se sim o que esta faltando??

Obrigado

Olhe esse post na parte sobre OneToOne. JPA: Mini Livro - Primeiros passos e conceitos detalhados

Hebert, eu ja tinha olhado o seu post, ele que me ajudou a chegar ate este ponto, inclusive deixei um questionamento la para vc… :slight_smile:

Questionamento este que pode ate ser a resposta que estou procurando para meu problema.

"[i]No final deste artigo voce fala que ?Não existe auto relacionamento?.

E coloca que tem que fazer

person.setCellular(cellular);
cellular.setPerson(person);

A pergunta é, onde eu devo colocar este codigo??[/i]"

Hebert, voce acha que pode ser este o meu problema? Onde eu devo colocar esta parte do codigo?

Abc

Estou nesse mesmo dilema…

No meu caso, que se enquadra na página 20 do tutorial,

Faço as anotações do relacionamento conforme descrito e com elas o sistema não funciona!

Estou usando como modelo a apostila da caelum FJ28 que fiz e refiz varias vezes.

Aguardo ancioso por essa resposta.

Desde já agradeço.