10
respostas

Dúvida sobre Embedded Objects

Boa tarde, estou exercitando o que foi dado neste curso fazendo um cadastro de clientes e estou tendo um problema, após preencher os dados no formulário de cadastro e dar o submit, os atributos do cliente estão sendo salvos no banco de dados, exceto o endereço. Alguém poderia me ajudar?

Na entity Cliente tenho o atributo Endereco anotado com @Embedded, que indica à JPA que ela deve entender Endereco como uma classe comum e não uma entity. Todos os campos relacionados a ela serão mapeados para dentro de Cliente. A classe Endereco não é uma entity, mas anotei com @Embeddable que indica à JPA que essa classe pode ser ‘anexada’ a uma entity.

Já utilizei relacionamento @ManyToOne e também não resolveu o problema.

Em ambos os casos o hibernate cria as tabelas no banco, considerando os atributos do endereço, sendo que no primeiro cria somente uma tabela (cliente + endereço), como esperado.

Segue abaixo os códigos:

import java.util.Calendar;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.springframework.format.annotation.DateTimeFormat;

@Entity
public class Cliente {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    private String nome;

    @DateTimeFormat
    private Calendar dataNascimento;

    private String rg;
    private String cpf;
    private String telefone;
    private String celular;

    @Embedded
    private Endereco endereco;

    private String email;
    private String senha;

    private String imagemPath;

    public Cliente() {
    }

    public Integer getId() {
        return id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Calendar getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Calendar dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getImagemPath() {
        return imagemPath;
    }

    public void setImagemPath(String imagemPath) {
        this.imagemPath = imagemPath;
    }

}
import javax.persistence.Embeddable;

@Embeddable
public class Endereco {

    private String cep;
    private String rua;
    private String numero;
    private String complemento;
    private String bairro;
    private String cidade;
    private String uf;

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

}
<%@ taglib tagdir="/WEB-INF/tags" prefix="tags"%>
<%@ include file="/WEB-INF/WebServices/wsCorreios.jsp"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<tags:pageTemplate titulo="Consultório Dentário">

    <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">

        <form:form action="${s:mvcUrl('CC#gravar').build() }" method="POST"
            commandName="cliente" enctype="multipart/form-data">
            <div class="container-fluid">
                <div class="form-group" class="row">
                    <!-- DADOS PESSOAIS-->
                    <fieldset class="col-md-4">
                        <legend>Dados Pessoais</legend>
                        <div class="form-group">
                            <label>Nome completo*</label>
                            <form:input path="nome" id="nome" class="form-control"
                                value="${cliente.nome}" placeholder="Digite seu nome" />
                            <form:errors path="nome" />
                        </div>
                        <div class="form-group">
                            <label>Data de Nascimento</label>
                            <form:input path="dataNascimento" id="dataNascimento"
                                class="form-control" value="${cliente.dataNascimento}"
                                placeholder="dd/MM/aaaa" />
                            <form:errors path="dataNascimento" />
                        </div>
                        <div class="form-group">
                            <label>RG</label>
                            <form:input path="rg" id="rg" class="form-control"
                                value="${cliente.rg}" placeholder="00.000.000-0" />
                        </div>
                        <div class="form-group">
                            <label>CPF*</label>
                            <form:input path="cpf" id="cpf" class="form-control"
                                value="${cliente.cpf}" placeholder="000.000.000-00" />
                            <form:errors path="cpf" />
                        </div>
                        <div class="form-group">
                            <label>Telefone*</label>
                            <form:input path="telefone" id="telefone" class="form-control"
                                value="${cliente.telefone}" placeholder="(00) 0000-0000" />
                            <form:errors path="telefone" />
                        </div>
                        <div class="form-group">
                            <label>Celular</label>
                            <form:input path="celular" id="celular" class="form-control"
                                value="${cliente.celular}" placeholder="(00) 00000-0000" />
                            <form:errors path="celular" />
                        </div>
                    </fieldset>

                    <!-- ENDEREÇO -->
                    <fieldset class="col-md-4">
                        <legend>Endereço</legend>
                        <div class="form-group">
                            <label>CEP</label> 
                            <input type="text" id="cep" name="cep" value="" size="10" maxlength="9" class="form-control"
                                value="${cliente.endereco.cep}" placeholder="Digite o cep">
                        </div>
                        <div class="form-group">
                            <label>Rua</label> 
                            <input type="text" id="rua" name="rua" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Número</label> 
                            <input type="text" id="numero" name="numero" size="5" class="form-control"
                                value="${cliente.endereco.numero}" placeholder="Digite o número">
                        </div>
                        <div class="form-group">
                            <label>Complemento</label> 
                            <input type="text" id="complemento"    name="complemento" size="40" class="form-control"
                                value="${cliente.endereco.complemento}"    placeholder="Digite o complemento">
                        </div>
                        <div class="form-group">
                            <label>Bairro</label> 
                            <input type="text" id="bairro" name="bairro" size="40" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Cidade</label> 
                            <input type="text" id="cidade" name="cidade" size="40" class="form-control">
                        </div>
                        <div class="form-group">
                            <label>Estado</label> 
                            <input type="text" id="uf" name="uf" size="2" class="form-control">
                        </div>

                    </fieldset>

                    <!-- DADOS DE LOGIN -->
                    <fieldset class="col-md-4">
                        <legend>Dados de login</legend>
                        <div class="form-group">
                            <label>E-mail</label>
                            <div class="input-group">
                                <span class="input-group-addon">@</span> <input type="email"
                                    class="form-control" id="email" name="email"
                                    value="${cliente.email}" placeholder="email@exemplo.com">
                            </div>
                        </div>
                        <div class="form-group">
                            <label>Senha</label> 
                            <input type="password" id="senha" name="senha" class="form-control" placeholder="senha">
                        </div>
                        <div class="form-group">
                            <label>Confirme a senha</label> 
                            <input type="password" id="passconfirm" name="passconfirm" class="form-control"    placeholder="confirme sua senha">
                        </div>
                        <div class="form-group">
                            <label>Imagem</label> <input type="file" name="imagem">
                        </div>
                        <br />
                        <c:if test="${cliente.id != null}">
                            <div class="form-group">
                                <button type="submit" class="btn btn-success">Atualizar</button>
                                <input type="hidden" name="id" value="${cliente.id}">
                            </div>
                        </c:if>

                        <c:if test="${cliente.id == null}">
                            <div class="form-group">
                                <button type="submit" class="btn btn-primary">Cadastrar</button>
                                <button type="reset" value="Limpar" class="btn btn-default">Limpar</button>
                            </div>
                        </c:if>

                        <br />
                    </fieldset>
                </div>
                <!-- fim .form-group -->
            </div>
            <!-- fim .container -->
        </form:form>
    </div>

</tags:pageTemplate>

Repare que no log do console o hibernate está inserindo os valores referentes ao endereço:

Hibernate: insert into Cliente (celular, cpf, dataNascimento, email, bairro, cep, cidade, complemento, numero, rua, uf, imagemPath, nome, rg, senha, telefone) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: select cliente0_.id as id1_0_, cliente0_.celular as celular2_0_, cliente0_.cpf as cpf3_0_, cliente0_.dataNascimento as dataNasc4_0_, cliente0_.email as email5_0_, cliente0_.bairro as bairro6_0_, cliente0_.cep as cep7_0_, cliente0_.cidade as cidade8_0_, cliente0_.complemento as compleme9_0_, cliente0_.numero as numero10_0_, cliente0_.rua as rua11_0_, cliente0_.uf as uf12_0_, cliente0_.imagemPath as imagemP13_0_, cliente0_.nome as nome14_0_, cliente0_.rg as rg15_0_, cliente0_.senha as senha16_0_, cliente0_.telefone as telefon17_0_ from Cliente cliente0_
10 respostas

Fala aí Raphael, blz?

Tenta inicializar o seu objeto Endereço na sua classe Cliente.

 @Embedded
private Endereco endereco = new Endereco();

Espero ter ajudado!

Fala Fernando, blz! Tentei inicializar o objeto Endereço na classe Cliente como você sugeriu mas continua não salvando o endereço...

Raphael olhando seu código na classe Endereco não tem nenhum identificador, sera que não teria que acrescentar um atributo id na classe Endereco?

Também estou passando pelo mesmo problema... não consigo fazer o banco gravar os dados. Fiz o mesmo tipo de modelagem e código. Também tentei inicializar o objeto e não funcionou.

esta class endereço esta em outra package?

si nao entendi errado esta fora do class Cliente.

vc ta pegando uma herança de outro pacote.

outra coisa tb voce pode fazer eh dar nome as colunas para todos nao so para este, isto eh so um ex: ´´´ @Embeddable public class Endereco { @Column(name="end_cep") private String cep; @Column(name="end_rua") private String rua; @Column(name="end_numero") private String numero; @Column(name="end_complemento") private String complemento; @Column(name="end_bairro") private String bairro; @Column(name="end_cidade") private String cidade; ´´´

@Embeddable 
public class Endereco { 
@Column(name="end_cep") 
private String cep; 
@Column(name="end_rua") 
private String rua; 
@Column(name="end_numero") 
private String numero; @Column(name="end_complemento") 
private String complemento; @Column(name="end_bairro")
 private String bairro;
 @Column(name="end_cidade") 
private String cidade;

ninguém para dar uma força nesse assunto? nenhum instrutor? obrigado

Fala aí Raphael, cara aparentemente seu código está correto.

Tem como subir seu código no github para eu reproduzir e tentar te ajudar?

Fernando, tentei de tudo e ainda não resolvi. O meu problema é o mesmo que o do Raphael. Acredito que estejamos fazendo algo errado no arquivo jsp, ou seja, acredito que não estejamos passando um endereço para a lista de cliente, pois quando escrevo no código para adicionar um endereço no banco, ele faz todo o processo certinho. Este jsp ai de form dele está ok?

obrigado