Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro com o meu ONETOMANY

Boa tarde, oque que estou errando aqui? vou postar.

import java.util.Calendar;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Cliente {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nome;
    private double peso;
    @OneToMany
    private Endereco endereco = new Endereco();
    @Temporal(TemporalType.DATE)
    private Calendar data = Calendar.getInstance();
    private Integer idade;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public Endereco getEndereco() {
        return endereco;
    }
    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
    public Calendar getData() {
        return data;
    }
    public void setData(Calendar data) {
        this.data = data;
    }
    public Integer getIdade() {
        return idade;
    }
    public void setIdade(Integer idade) {
        this.idade = idade;
    }
    public double getPeso() {
        return peso;
    }
    public void setPeso(double peso) {
        this.peso = peso;
    }
}
import javax.persistence.Entity;

@Entity
public class Endereco {

    private String bairro;
    private String cidade;
    private Integer numeroCasa;

    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 Integer getNumeroCasa() {
        return numeroCasa;
    }
    public void setNumeroCasa(Integer numeroCasa) {
        this.numeroCasa = numeroCasa;
    }
}
import javax.faces.bean.ManagedBean;

import br.com.bercalini.DAO.DAO;
import br.com.bercalini.nutricao.modelo.Cliente;
import br.com.bercalini.nutricao.modelo.Endereco;

@ManagedBean
public class ClienteBean {

    private Cliente cliente = new Cliente();
    private Endereco endereco = new Endereco();

    public void adiciona() {
        DAO dao = new DAO(Class.class);
            dao.adicionar(cliente);
            dao.adicionar(endereco);
    }
    public Cliente getCliente() {
        return cliente;
    }
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
    public Endereco getEndereco() {
        return endereco;
    }
    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
}

E tenho uma duvida aqui no meu metodo adicionar, quero salvar um cliente no banco de dados, e o endereco e uma outra classe, pelo oque aprendi na alura, é sempre uma boa pratica de programação e manutenção deixar seus atributos e metodos dentro da sua propria classe, então aqui to salvando um cliente, basta só salvar o cliente e a ira salvar o cadastro de endereco junto? ou vo ter que adicionar o endereco junto como fiz no metodo dentro do meu ClienteBean?

package br.com.bercalini.Bean;

import javax.faces.bean.ManagedBean;

import br.com.bercalini.nutricao.modelo.Endereco;

@ManagedBean
public class EnderecoBean {

    private Endereco endereco = new Endereco();

}

import javax.persistence.EntityManager;

public class DAO<T> {

    private EntityManager em;
    private final Class<T> classe;

    public DAO(Class<T> classe) {
        this.classe = classe;
    }

    public void adicionar(T t) {
        em = new JPAUtil().geEntityManager();
        em.getTransaction().begin();
        em.persist(t);
        em.getTransaction().commit();
    }
}
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<h:body>
    <h:form>
        <h2 style="font-style: oblique; text-align: left; color: blue;">Cadastro
            de Clientes</h2>
        <h:panelGrid columns="2">
            <h:outputLabel value="Nome: " for="nome" />
            <h:inputText id="nome" value="#{clienteBean.cliente.nome}" />
            <h:outputLabel value="Idade: " for="idade" />
            <h:inputText id="idade" value="#{clienteBean.cliente.idade}" />
            <h:outputLabel value="Peso: " for="peso" />
            <h:inputText id="peso" value="#{clienteBean.cliente.peso}" />
            <h:outputLabel value="Data: " for="data" />
            <h:inputText id="data" value="#{clienteBean.cliente.data.time}" >
                <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>
            </h:inputText>
            <h:outputLabel value="Cidade: " for="cidade" />
            <h:inputText id="cidade" value="#{clienteBean.endereco.cidade}" />
            <h:outputLabel value="Bairro: " for="bairro" />
            <h:inputText id="bairro" value="#{clienteBean.endereco.bairro}" />
            <h:outputLabel value="Numero Casa: " for="casa" />
            <h:inputText id="casa" value="#{clienteBean.endereco.numeroCasa}" />
        </h:panelGrid>
        <h:commandButton value="Gravar" action="#{clienteBean.adiciona}"/>
    </h:form>
</h:body>

</html>

Quando clico no botão salvar o erro é esse

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/nutricao] threw exception [java.lang.ExceptionInInitializerError] with root cause
org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: br.com.bercalini.nutricao.modelo.Cliente.endereco

Pelo oque eu entendi estou errando no @OneToMany Mais não está correto? um cliente pode ter mais de um endereco? mais no erro eu entendi que eu deveria ter uma anotação na minha classe endereco para cliente, mais que sentido faz? endereco nao tem um cliente e sim um cliente tem um endereco nao é? oque fazer?

2 respostas
solução!

Oi Alisson,

Sempre que você mapeia um relacionamento One To Many quer dizer que você está dizendo que cada objeto será relacionado por muitos de outro tipo.

No seu código você tem um Cliente e este Cliente tem muitos endereços então você precisa representar muitos endereços no Java.

Como são muitos endereços, você deve relacioná-lo como uma Lista por exemplo. Neste caso ficaria:

@OneToMany
private List<Endereco> enderecos;

Abraço!

Opa obrigado!