Cidade estado jpa como proceder?

15 respostas
F

Bom dia!

Estou tentando desenvolver uma aplicação, tenho no meu banco de dados uma tabela ESTADO e uma CIDADE, com o relacionamento de um(ESTADO) pra muitas(CIDADE).

Bom…Agora eu tenho outra tabela no meu banco uma chamada ENDERECO,
e entre os atributos desta tabela, eu tenho como foreign key id_estado e id_cidade fazendo referencia as tabelas ESTADO e CIDADE respectivamente.

Como eu posso programar isso, usando hibernate/jpa?

  • Preciso criar as entidades Estado, Cidade ?
  • Preciso ter na minha entidade Endereco, os objetos Estado e Cidade?

Bom, eu não preciso saber as anotações, mas sim como programar isso, visto que estou usando hibernate/jpa e jsf.
Está meio escuro pra mim sobre como isso vai funcionar…

Tipo, eu posso fazer isso ?

public class Estado {

	private Integer id;
	private String sigla;
	private String nome;
	private Set<Cidade> cidades = new HashSet<Cidade>();

}
public class Cidade {

	private Integer id;
	private String nome;
	private Estado estado;

}
public class Endereco {
	
	private Estado estado;
	private Cidade cidade;

}

Eu pretendo carregar os estados e cidades em um combo box no jsf, e depois pegar o objeto selecionado do combo e gravar na classe Endereco.
Mas não sei se é isso que devo fazer…

Obrigado,
t+

15 Respostas

C

Filipe A.:
Bom dia!

Estou tentando desenvolver uma aplicação, tenho no meu banco de dados uma tabela ESTADO e uma CIDADE, com o relacionamento de um(ESTADO) pra muitas(CIDADE).

Bom…Agora eu tenho outra tabela no meu banco uma chamada ENDERECO,
e entre os atributos desta tabela, eu tenho como foreign key id_estado e id_cidade fazendo referencia as tabelas ESTADO e CIDADE respectivamente.

Como eu posso programar isso, usando hibernate/jpa?

  • Preciso criar as entidades Estado, Cidade ?
  • Preciso ter na minha entidade Endereco, os objetos Estado e Cidade?

Bom, eu não preciso saber as anotações, mas sim como programar isso, visto que estou usando hibernate/jpa e jsf.
Está meio escuro pra mim sobre como isso vai funcionar…

Tipo, eu posso fazer isso ?

public class Estado {

	private Integer id;
	private String sigla;
	private String nome;
	private Set<Cidade> cidades = new HashSet<Cidade>();

}
public class Cidade {

	private Integer id;
	private String nome;
	private Estado estado;

}
public class Endereco {
	
	private Estado estado;
	private Cidade cidade;

}

Eu pretendo carregar os estados e cidades em um combo box no jsf, e depois pegar o objeto selecionado do combo e gravar na classe Endereco.
Mas não sei se é isso que devo fazer…

Obrigado,
t+


Chapa eu ja fiz isso e fiz quase desse jeito, criei as entidades Cidade e Estado, funcionou beleza!

F

Valeu Carlos!

Poxa, disse antes que não iria precisar das anotações rs…mas pensando melhor.

Como eu faço o mapeamento dos objetos Estado e Cidade na classe Endereco? Vão ficar one-to-one ?

public class Endereco {  
    
    @OneToOne
    private Estado estado;
    @OneToOne  
    private Cidade cidade;  
  
}

Só preciso, dessa anotação né? Tipo, na classe Estado e Cidade não vai ter nada com referencia a classe Endereco?

Obrigado,

t+

D

Pq vc tem relacionamento de endereço com Estado e vc pode resolver isso através de Cidade?

endereco.getEstado().getCidade();

Ou será q tem como o cara morar em uma cidade de e outro estado?

F

Sim realmente, eu não preciso do Estado.

Mas me surgiu uma duvida agora…Quando eu salvar o Endereco, eu vou estar salvando o Estado e a Cidade :?:

E eu acho que eu não posso salvar o Estado e a Cidade, porque eles já vão estar salvos…eu só precisaria “ligar” eles com o Endereco…

Ou seja, tem algo errado nisso não tem ?

Obrigado,
t+

A

Não seria melhor as classes serem geradas pelo hibernate através das tabelas?

D

O comportamento no momento q vc estiver persistindo a entidade Endereco vai depender de como vc configura o atributo cascade do relacionamento. Mas independentemente desse atributo, o JPA ñ vai duplicar a entidade, ou seja, se o atributo Estado em Endereco, ou o atributo Cidade em Estado, apontarem p/ uma entidade q já está no banco ele ñ vai persistir ela novamente.

F

sim acromo é uma possibilidade. :wink:

Contudo preciso acertar as tabelas…

Pensei agora, se talvez eu tivesse na classe Endereco, o nome do Estado de da Cidade como campo varchar, em vez do objeto.

Pois como os Estado e Cidades já vão estar salvos no banco…e serão carregados no combo box,
talvez eu pudesse passar do combo box para um objeto Estados ou Cidade e pegar o nome e guardar no Endereco.

Valeu!
t+

D

Eu eim, agora vc viajou legal!! Se as entidades existem qual o problema em usar relacionamentos? Afinal é p/ isso q eles servem, ñ é? Além do mais se vc guardar apenas o nome na classe Endereço e vc tiver um objeto Endereço e precisar alguma informação de Cidade ou Estado q ñ o nome vc precisará fazer outra consulta no banco. Isso vai denegrir a performance geral do seu aplicativo, sem falar em aumentar o tamanho e a complexidade do código piorando a manutenção.

C

Filipe A.:
Valeu Carlos!

Poxa, disse antes que não iria precisar das anotações rs…mas pensando melhor.

Como eu faço o mapeamento dos objetos Estado e Cidade na classe Endereco? Vão ficar one-to-one ?

public class Endereco {  
    
    @OneToOne
    private Estado estado;
    @OneToOne  
    private Cidade cidade;  
  
}

Só preciso, dessa anotação né? Tipo, na classe Estado e Cidade não vai ter nada com referencia a classe Endereco?

Obrigado,

t+


Experimentalmente eu manipulo TODOS os meus relacionamentos para (1,n), acho que fica melhor de controlar o crescimento da aplicação.

F

:shock:

pois é… :oops:

Bom na verdade no banco o relacionamento esta (1,n) tipo a tabela ENDERECO possui uma foreign key id_cidade e id_estado.

Bom…Quer dizer então que se eu salvar o Endereco com uma Cidade ou Estado que já esteja salvo, ele não vai salvar novamente?
Ele irá apenas salvar o id da tabela Estado e Cidade nas foreign keys da minha tabela ENDERECO ?

É isso ? E além do mais eu tenho o atributo cascade do hibernate/jpa pra me ajudar mesmo que não precise dele.

Obrigado!
t+

A

Quando eu vou trabalhar com endereço geralmente eu tenho algumas tabelas que são, Endereço, Rua, Bairro, Cidade, Estado onde:

Endereço tem:
id_Rua
numero
cep
complemento

Rua tem:
id_Bairro
nome

Bairro tem:
id_Cidade
nome

Cidate tem:
id_Estado
nome

Estado tem:
nome
sigla

Não é exatamente isto que utilizo mais é algo parecido com isto, até gostaria de saber se alguem tem alguma sugestão melhor.

D

Na verdade o melhor mesmo é vc modelar o seu código de maneira coerente. Fica difícil p/ um programador tentar entender pq um relacionamento q parece ser OneToOne estar mapeado como OneToMany. Sem falar q relacionamentos OneToMany adicionam complexidade ao código já q eles são representados p/ coleções e ñ por objetos. Isso obrigaria vc a escrever o código…

endereco.getEstado();

… desse modo:

endereco.getEstados().get(0);

Procurar modelar o seu código da maneira mais coerente com o modelo de negócios do seu cliente promove um código mais simples, legível e fácil de manter. Se vc se deparar em algum momento com uma situação em q o sua arquitetura ñ seja mais adequada vc refatora. Afinal é p/ isso q serve a refatoração.

A

Então dev.rafael no exemplo que citei acima para recuperar as informações ficaria desta forma:

endereco.getRua().getBairro().getCidade();

isso não é o ideal?

D

Foi mal kra. O meu post demorou e ficou confuso. Eu ñ estava me referindo ao seu post mas ao do Carlos_ds_jar sobre usar sempre OneToMany.
Desculpe a confusão.

A

:lol: tudo bem cara é que eu também tenho um pouco de duvida se a forma que eu faço é adequada…, as mensagens ficaram em uma ordem um pouco confusa mesmo :lol: :lol: :lol:

Criado 15 de outubro de 2010
Ultima resposta 15 de out. de 2010
Respostas 15
Participantes 4