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

Duvida ao adicionar 2 classes no banco

Tenho 2 classes no meu java, e quero adicionar. Com uma Classe até o ponto do curso eu consigo adicionar, não se se pra frente encinam a fazer com 2 Classe com uma a relação a outra. Vou dar um exemplo.

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Cliente  implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;
    private String nome;
    private String cpf;
    private String rg;
    private String telefone;
    @OneToMany(fetch=FetchType.LAZY)
    private List<Endereco> enderecos = new ArrayList<Endereco>();

    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public String getCpf() {
        return cpf;
    }
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
    public String getRg() {
        return rg;
    }
    public void setRg(String rg) {
        this.rg = rg;
    }
    public String getTelefone() {
        return telefone;
    }
    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
    public List<Endereco> getEnderecos() {
        return enderecos;
    }
    public void setEnderecos(List<Endereco> enderecos) {
        this.enderecos = enderecos;
    }
}

import java.io.Serializable;

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

@Entity
public class Endereco implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id @GeneratedValue
    private long idCliente;
    private String cidade;
    private String bairro;
    private String numeroCasa;

    public long getIdCliente() {
        return idCliente;
    }
    public void setIdCliente(long idCliente) {
        this.idCliente = idCliente;
    }
    public String getCidade() {
        return cidade;
    }
    public void setCidade(String cidade) {
        this.cidade = cidade;
    }
    public String getBairro() {
        return bairro;
    }
    public void setBairro(String bairro) {
        this.bairro = bairro;
    }
    public String getNumeroCasa() {
        return numeroCasa;
    }
    public void setNumeroCasa(String numeroCasa) {
        this.numeroCasa = numeroCasa;
    }


}

Como podem ter visto na Classe Cliente tem um Endereço. Como seria o meu metodo adiciona para popular no banco? Oque tenho é o meu adiciona com uma classe que seria assim.

public void adicionarCliente(T t) {
        EntityManager manager = new JPAUtil().geEntityManager();
        manager.getTransaction().begin();
        manager.persist(t);
        manager.getTransaction().commit();
        manager.close();
    }

como seria esse metodo? e depois como chamarei esse dao no meu controller? algo assim?

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

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

@ManagedBean
@ViewScoped
public class ClienteController implements Serializable{


    private static final long serialVersionUID = 1L;

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

    public void adicionar() {
        new DAO<Cliente>(Cliente.class).adicionarCliente(this.cliente);
        new DAO<Endereco>(Endereci.class).adicionarCliente(this.endereco);
    }

    public Endereco getEndereco() {
        return endereco;
    }

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

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }



}

Quais seriam minhas modificaçoes? me ajudem porfavor :(

14 respostas

Olá,

A sua entidade Cliente tem um ou mais entidades Endereços. Usando relacionamento Um para Muitos unidirecional.

Você cria uma instância de Cliente e uma ou mais instâncias de Endereço.

Em seguida, adiciona as instâncias de Endereço na sua lista Cliente.enderecos.

Agora sim, você pode persistir a sua instância de Cliente.

Alisson, essa é a mesma dúvida que vc abriu no outro tópico, que inclusive ainda estávamos debatendo. De todo modo, eu mudaria a classe Endereco:

public class Endereco {

@Id @GeneratedValue
  private Long id;

 //atributos que vc ja declarou
//poderia ser OneToOne
@ManyToOne
private Cliente cliente;

setCliente

getCliente
}

Aí é só chamar o setCliente antes de salvar o endereço. Vou fechar o outro tópico.

Correto Alberto pode fechar, eu chamo o meu setCliente ? Como ficaria o metodo adicionar nesse caso Alberto? E muito obrigado Cassius

Algo assim?

public void adicionar() {
        cliente.getEnderecos().add(this.endereco);
        new DAO<Cliente>(Cliente.class).adicionarCliente(this.cliente);
    }

Pode ser sim, dado que o cliente tem vários endereços. Você chegou a testar o código? Um dos ensinamentos que mais foram legais para mim, foi sair testando que vem na minha mente e verificando se funciona.

Alberto quando eu coloco desse jeito aparece o erro do transient e depois que eu coloco o meu dao encima da minha lista adiciona so o cliente e nao o endereço

Tem como você postar em código como que você faz essa parte em adicionar um Cliente e depois um Endereço para esse cliente?

Alberto fiz conforme você falo, me passo algo na cabeça e fui testando até que cheguei em uma solução a qual aparentemente rodou, verifica se está correto fazendo favor? na minha Classe dao fiz umas modificações no metodo adicionar.

public void adicionarCliente(T t, Endereco endereco) {
        EntityManager manager = new JPAUtil().geEntityManager();
        manager.getTransaction().begin();
        manager.persist(t);
        manager.persist(endereco);
        manager.getTransaction().commit();
        manager.close();

No metodo passei um argumento do tipo Endereco está correto? depois persisti ele no banco depois da minha Classe Cliente.

no metodo adicionar no meu ClienteController fico assim

public void adicionar() {


        cliente.setEndereco(endereco);

        new DAO<Cliente>(Cliente.class).adicionarCliente(this.cliente, endereco);


        this.cliente = new Cliente();
        this.endereco = new Endereco();

Confere? está correto?

solução!

Eu criaria um dao específico para o cliente, acho que não faz sentido usar o genérico, dado que vc tem coisas específicas do cliente nele.

Ok correto Alberto, mais no resto está tudo certo? eu só tava com essa duvida mesmo, está correto assim?

Alberto algo parecido com isso?

public class CadastroCliente {

    public void adicionaCliente(Cliente cliente, Endereco endereco) {
        EntityManager manager = new JPAUtil().geEntityManager();
        manager.getTransaction().begin();
        manager.persist(cliente);
        manager.persist(endereco);
        manager.getTransaction().commit();
        manager.close();
    }

e aqui no metodo adiciona no clientecontroller

public class ClienteController implements Serializable{


    private static final long serialVersionUID = 1L;

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

    public void adicionaCliente() {
        new CadastroCliente().adicionaCliente(this.cliente, this.endereco);
        this.cliente = new Cliente();
        this.endereco = new 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;
    }
}

Dessa forma?

Acho que está num caminho melhor sim :)

Valeu mano! obrigado pela ajuda!!

Olá,

Conforme a primeira dica abaixo, para fazer um relacionamento Um para Muitos unidirecional, utiliza-se a anotação @ManyToOne na entidade filha/dependente:

Hibernate @ManyToOne Unidirectional Tutorial – How to Program with Java

Database Relationships – One to Many – How to Program with Java

Database Relationships – Many to Many / One to One