Hibernate: Mapeamento 1:1

3 respostas
eliasfsjunior

Galera estou com uma duvida em um mapeamento 1:1 no Hibernate.
O que eu quero fazer é o seguinte: Ter uma tabela de endereço única, com uma Primary Key própria, dessa forma, uma tabela cliente ou fornecedor ou concessionaria poderá usa-la. A chave primária da tabela endereço vai para outra tabela.

Eu já vi muita gente usando uni-direcional aonde a Primary Key da tabela CLIENTE vai para tabela ENDERECO, eu quero fazer exatamente o contrario.

Tentei fazer com o código abaixo mas não consegui. Como fazer as anotações nesse tipo de relacionamento?

package br.com.ebx.model.bean;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

@Entity
@Table(name = "be_concessionaria")
public class ConcessionariaBean implements Serializable {

	private static final long serialVersionUID = -2784198665091509098L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "concessionaria_id")
	private Integer id;
	
	@Column(name = "concessionaria_nome", length = 50)
	private String nome;
	
	@OneToOne(mappedBy = "endereco")
	@JoinColumn(name = "endereco_id")
	private EnderecoBean endereco;
	
	@Column(name = "concessionaria_telefone")
	private Integer telefone;
	
	@Temporal(TemporalType.DATE)
	@Column(name = "concessionaria_data_cadastro")
	private Date dataCadastro = new Date();

       // METODOS SUPRIMIDOS
	
}

Endereco.class

package br.com.ebx.model.bean;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name = "be_endereco")
public class EnderecoBean implements Serializable {

	private static final long serialVersionUID = -6263800399080111668L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "endereco_id")
	private Integer id;
	
	@Column(name = "endereco_logradouro", length = 70)
	private String logradouro;
	
	@Column(name = "endereco_numero", length = 6)
	private Integer numero;
	
	@Column(name = "endereco_complemento", length = 40)
	private String complemento;

	@Column(name = "endereco_cep", length = 8)
	private Integer cep;
	
	@Column(name = "endereco_bairro", length = 40)
	private String bairro;
	
	@Column(name = "endereco_cidade", length = 40)
	private String cidade;
	
	@Column(name = "endereco_uf", length = 2)
	private String uf;

        // METODOS SUPRIMIDOS
}

3 Respostas

drsmachado

Se eu entendi direito, você vai fazer um relacionamento um para um de endereço para cliente, fornecedor e os cambau?
Desculpe, já erra por isso.
Vamos supor que seja um prédio. Lá moram quantos clientes? Vamos piorar, suponha que neste prédio, o andar térreo seja só para comércio. E vamos deixar pior, pois nos 3 primeiros andares só existem fornecedores.
O mesmo endereço serve para vários clientes, vários fornecedores e vários os cambau. Opa, o relacionamento não pode ser 1 : 1, tem que ser 1 : N.

eliasfsjunior

Não cara, eu não estava querendo otimizar o banco. Eu sei que o raciocínio correto é esse.
Mas por questões de aprendizagem eu tava querendo fazer assim. Não estou me preocupando com o Banco.

Os endereços podem repetir no Banco, sem problemas, por exemplo:

ID: 1 Rua Tal, Num 23
ID: 2 Rua B, Num 34 Andar 3
ID: 3 Rua B, Num 34 Loja A
ID: 4 Rua B, Sobre Loja

Entendeu? Dessa forma cada endereço teria um ID para associar com pessoa, fornecedor, etc…

drsmachado

eliasfsjunior:
Não cara, eu não estava querendo otimizar o banco. Eu sei que o raciocínio correto é esse.
Mas por questões de aprendizagem eu tava querendo fazer assim. Não estou me preocupando com o Banco.

Os endereços podem repetir no Banco, sem problemas, por exemplo:

ID: 1 Rua Tal, Num 23
ID: 2 Rua B, Num 34 Andar 3
ID: 3 Rua B, Num 34 Loja A
ID: 4 Rua B, Sobre Loja

Entendeu? Dessa forma cada endereço teria um ID para associar com pessoa, fornecedor, etc…


Se é pra aprender, esqueça essa idéia.
Banco de dados com dados repetidos não serve para nada.
Se você quer um bom exemplo de associação 1 : 1, crie um sistema de gerenciamento de casamento.
Segundo a legislação brasileira, uma pessoa só pode casar-se uma vez (salvo se divorciar-se ou enviuvar).
Logo, cadastre Noivo, Noiva e faça as associações que achar mais adequado.
Ou, se preferir, crie uma classe Documento, que corresponda a CPF ou CNPJ.
Cada pessoa só pode ter 1 CPF e cada empresa, 1 CNPJ (na teoria da legislação).

Criado 3 de agosto de 2012
Ultima resposta 3 de ago. de 2012
Respostas 3
Participantes 2