Duvida com @OneToOne Hibernate

10 respostas
danieldomingues86

Oi pessoal,

Eh o seguinte… Eu tenho um formulario HTML e nele eh feito o cadastro do cliente, e tem informacoes tanto pessoais do cliente (nome, cpf, telefone…) e informacoes do endereco do cliente (rua,cep…)
Quando a cliente preenche o formulario alguns dados vao para a tabela cliente e outros vao para a tabela endereco do banco, ate ai ok.

Estou usando Hibernate, e no meu bean Cliente eu tenho um atributo Endereco e esta mapeado com @ annotations OneToOne, que eh o que eu quero, cada cliente tem um
endereco, ok, no banco na tabela cliente foi gerado todos os atributos de cliente + um campo que eh FK se chama endereco_id para se relacionar com a tabela endereco.

Mas a duvida eh o seguinte, quando eu preencho o formulario ele grava todos os dados do cliente e do endereco , mas o campo endereco_id fica em branco, ou seja, nao relaciona
aquele endereco com aquele cliente. Como faco pra consertar isso?

Quero que gere para mim um endereco_id que seja referente ao endereco na tabela Endereco.

Quem souber por favor eu agradeco a resposta.
Flw.

10 Respostas

bruno_savi

Olá meu amigo poderia colocar o codigo para podermos analisar.

RafaFloripa

caramba eu to com o msm problema
mas…em outro escopo outras infos

mas diferente de vc eu tenho o “codEndereco” na primeira vez ele nao faz o select a partir do cod e aparece em branco, mas se eu dou refresh na pagina ele aparece

danieldomingues86

Ai esta :

@Entity
public class Cliente {

	@Id
	@GeneratedValue
	private Long id;
	private String usuario;
	private String senha;
    private String nome;
    private String cpf;
    private String telefone;
    private String email;
	
    @OneToOne
    private Endereco endereco;

    public Cliente() {
        super();
    }
@Entity
public class Endereco {
	
	@Id
	@GeneratedValue
	private Long id;
	private String rua;
	private Integer numero;
	private String bairro;
	private String cidade;
	private String estado;
	private String cep;
	

	public Endereco() {
		super();
	}
formulario HTML :
<form method="post" action="cadastroCliente.do">

<table width="50%">

	<tr>
		<td><span class='tituloform'><br>
		<b>Usuario & Senha:</b></span><br>
		</td>

	</tr>
	<tr>
		<td class='gridTopico'>
		<table width='50%' border='0' cellspacing='1'>
			<tr>
				<td width='16%' class='gridTopico'>*Usuario</td>
				<td width='84%' class='gridTopico'><input
					name="cliente.usuario" type="text" size='80'></td>
			</tr>
			<tr>
				<td class='gridTopico'>*Senha</td>
				<td class='gridTopico'><input name="cliente.senha" type="text"
					size='80'></td>
			</tr>
		</table>
		</td>
	</tr>


	<tr>
		<td><span class='tituloform'><br>
		<b>Dados Pessoais:</b></span><br>
		</td>

	</tr>
	<tr>
		<td class='gridTopico'>
		<table width='50%' border='0' cellspacing='1'>
			<tr>
				<td width='16%' class='gridTopico'>*Nome</td>
				<td width='84%' class='gridTopico'><input name="cliente.nome"
					type="text" size='80'></td>
			</tr>
			<tr>
				<td class='gridTopico'>*CPF</td>
				<td class='gridTopico'><input name="cliente.cpf" type="text"
					size='80'></td>
			</tr>
			<tr>
				<td class='gridTopico'>E-mail</td>
				<td class='gridTopico'><input name="cliente.email" type="text"
					size='80'></td>
			</tr>
			<tr>
				<td class='gridTopico'>Telefone</td>
				<td class='gridTopico'><input name="cliente.telefone"
					type="text"></td>
			</tr>
		</table>
		</td>
	</tr>
	<tr>
		<td><span class='tituloform'><br>
		<b>Endere&ccedil;o:</b></span><br>
		</td>
	</tr>

	<tr>
		<td bgcolor='#FFFFFF' class='gridTopico'>
		<table width='50%'>
			<tr>
				<td class='gridTopico'>*Rua/Av</td>
				<td class='gridTopico'><input name='endereco.rua' type='text'
					size='60'></td>
				<td class='gridTopico'>N&uacute;mero</td>
				<td class='gridTopico'><input name='endereco.numero'
					type='text' size='5'></td>
			</tr>
			<tr>
				<td class='gridTopico'>Bairro</td>
				<td class='gridTopico'><input name='endereco.bairro'
					type='text' size='60'></td>
				<td class='gridTopico'>*Cidade</td>
				<td class='gridTopico'><input name='endereco.cidade'
					type='text'></td>
			</tr>
			<tr>
				<td class='gridTopico'>*Estado</td>
				<td class='gridTopico'><input name='endereco.estado'
					type='text' size='60'></td>
				<td class='gridTopico'>CEP</td>
				<td class='gridTopico'><input name='endereco.cep' type='text'></td>
			</tr>
		</table>
		</td>
	</tr>

	<tr>
		<td class='tituloform'>* campos obrigat&oacute;rios</td>
	</tr>
	<tr>
		<td class='tituloform'><br>
		<div style="text-align: right;"><input type="submit"
			value="Cadastrar"></div>
		</td>
	</tr>

</table>

</form>

Se precisar de mais alguma coisa me avisa que eu posto ai

Vlw.

T

Tente colocar um join column para indicar ao hibernate a qual colunas está relacionado o objeto endereço, mas ou menos assim:

@OneToOne
@JoinColumn(name="endereco_id")
private Endereco endereco;
danieldomingues86

Entao eu acabei de fazer isso que voce disse, gerei o banco denovo e o campo FK endereco_id da tabela Cliente simplesmente desapareceu, eh assim mesmo?

Se for assim como eu vou fazer o select ou como vou saber se aquele endereco eh daquele cliente sem uma FK?

Flw.

D

Na verdade o JoinColum não é obrigatório, ele serve pra vc dar um nome específico ao campo, se vc não colocar ele vai gerar o campo mas com um nome criado por ele mesmo…
Você tentou fazer o q o colega ai de cima falou? Dá um update que ai quando você abrir a aplicação ele vai estar associado…
acho q é isso ai…
qlqr coisa fala

Vlw []'s

danieldomingues86

Ola,

Ja fiz sim, e nao mudou em nada, com JoinColumn ou sem da na mesma,
E se o update que voce se refere eh dar um refresh ja tentei tambem e nao mudou.

Flw.

davidbuzatto

Primeiro salve o endereco, depois o cliente.

Endereco e = new Endereco();
e.setAlgumaCoisa();...
// salvar endereço aqui

Cliente c = new Cliente();
c.setOutraCoisa();
c.setEndereco(e);
// salvarClienteAqui

Ou seja, vc precisa o objeto endereço persistido (para ter o id dele!) para poder salvar o cliente.

Outras observações:
Use uma transação para salvar seus objetos.
A implementação dos construtores sem argumentos no seu caso é desnecessária. Se mesmo assim quiser manter os construtores, a chamada a super() tbm é desnecessária. O compilador cuida disso para você. Como você é SCJP, devia saber disso não é? :?

[]´s

danieldomingues86

Primeiramente gostaria de dizer que estou salvando o Endereco primeiro e depois o Cliente, e isso ainda nao resolve o problema.

Sou SCJP com orgulho e sei trabalhar muito bem com a linguagem, nao vejo nenhum problema em querer deixar os construtores default, sendo default ou nao com super() ou nao, desculpe-me mas nao mudara onde Realmente esta o problema, pois posso muito bem usar setters/getters da forma que eu bem entender.

Unica coisa que nao tentei fazer eh usar a transacao, na qual tentarei isso sim pode ajudar, pois minha duvida eh com o uso do “Hibernate”. De resto sei me virar muito bem.

Flw.

danieldomingues86

E ai pessoal,

Oba! :slight_smile:

Resolvido o problema era com o id do Endereco mesmo que tava vindo null, nao sabia como o Hibernate lidava com isso.

Obrigado david por essa dica e a todos que ajudaram.

Flw.

Criado 17 de setembro de 2009
Ultima resposta 20 de set. de 2009
Respostas 10
Participantes 6