OneToOne Bidirecional

3 respostas
E

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

3 Respostas

H

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

E

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

R

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.

Criado 30 de janeiro de 2013
Ultima resposta 3 de fev. de 2013
Respostas 3
Participantes 3