Hibernate - Relacionamento 1:1

1 resposta
J

Olá,

Estou com problema para mapear o seguinte relacionamento:

Tabela tDepartamento possui o campo id_responsavel(FK) que referencia o campo id(PK) da tabela tPessoa.

@Entity
@Table(name="tDepartamento")
public class Departamento extends AbstractModel {
	
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private long codigo;
	@Column(name="nome")
	private String nomeDepartamento;
	
	@Column(name="id_responsavel")
	private long idResponsavel;

        getters e setters
@Entity
@Table(name="tPessoa")
public class Pessoa extends AbstractModel {
	
	@Id
	private long id;
	
	private String nome;
	private String sobrenome;
	private String endereco;
	private String cep;
	private String telefone;
	private String email;
	
	@OneToOne
	@JoinColumn(name="id")
	@JoinTable(name="tDepartamento", joinColumns = @JoinColumn(name="id_responsavel"))	
	private Departamento departamento;


        getters e setters

Ao listar todos os registros de Pessoa, o hibernate gera as seguintes queries:

Hibernate: select usuario0_.id as id0_, usuario0_.password as password0_, usuario0_.username as username0_ from tUsuario usuario0_
Hibernate: select pessoa0_.id as id1_1_, pessoa0_.cep as cep1_1_, pessoa0_.email as email1_1_, pessoa0_.endereco as endereco1_1_, pessoa0_.nome as nome1_1_, pessoa0_.sobrenome as sobrenome1_1_, pessoa0_.telefone as telefone1_1_, departamen1_.codigo as codigo2_0_, departamen1_.id_responsavel as id1_2_0_, departamen1_.nome as nome2_0_ from tPessoa pessoa0_ left outer join tDepartamento pessoa0_1_ on pessoa0_.id=pessoa0_1_.id_responsavel left outer join tDepartamento departamen1_ on pessoa0_.id=departamen1_.codigo where pessoa0_.id=?
Hibernate: select pessoa0_.id as id1_1_, pessoa0_.cep as cep1_1_, pessoa0_.email as email1_1_, pessoa0_.endereco as endereco1_1_, pessoa0_.nome as nome1_1_, pessoa0_.sobrenome as sobrenome1_1_, pessoa0_.telefone as telefone1_1_, departamen1_.codigo as codigo2_0_, departamen1_.id_responsavel as id1_2_0_, departamen1_.nome as nome2_0_ from tPessoa pessoa0_ left outer join tDepartamento pessoa0_1_ on pessoa0_.id=pessoa0_1_.id_responsavel left outer join tDepartamento departamen1_ on pessoa0_.id=departamen1_.codigo where pessoa0_.id=?

e encontra os registros de Pessoa porém sem a referência para o departamento. o campo departamento vem sempre null.

Alguma luz de como fazer este mapeamento?

Grato

1 Resposta

plentz

Alguns pontos:
- O que vem a ser "extends AbstractModel"?
- Seu banco foi provavelmente criado por algum DBA das antigas. Eita costumezinho porco esse de colocar "t","tbl" o mesmo "table" na frente do nome das tabelas.
- Seu relacionamento está errado. O correto seria você ter ter um OneToOne em cada lado, sendo um mappedBy pra dizer que o outro lado é o responsável por indicar as colunas do relacionamento.
- A anotação @JoinTable nesse caso não faz o menor sentido.

Tente algo assim
@Entity
 @Table(name="tDepartamento")
 public class Departamento extends AbstractModel {
 	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
 	private long codigo;

 	@OneToOne
 	@JoinColumn(name="id_responsavel")
 	private Pessoa responsavel;
@Entity
 @Table(name="tPessoa")
 public class Pessoa extends AbstractModel {
 	
 	@Id
 	private long id;
 	
 	private String nome;
 	private String sobrenome;
 	private String endereco;
 	private String cep;
 	private String telefone;
 	private String email;
 	

 	@OneToOne(mappedBy="departamento")
 	private Departamento departamento;
Criado 20 de abril de 2007
Ultima resposta 23 de abr. de 2007
Respostas 1
Participantes 2