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

Duvida na hora da modelagem

Tenho uma duvida, vou tentar ser o mais claro possivel, na minha cabeça da seguinte forma estou pensando em fazer a seguinte maneira.

@Entity
@SuppressWarnings("serial")
public class Cliente implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private String cpf;
    private String cnpj;
    private String tipoPessoa;
    private String telefone;
    private String celular;
    private String email;
    private Boolean situacao;
    @ManyToOne(cascade = CascadeType.REMOVE)
    @JoinColumn(name = "endereco_codigo")
    private Endereco endereco = new Endereco();
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "cliente")
    private List<Carro> carros = new ArrayList<Carro>();
@Entity
@SuppressWarnings("serial")
public class Carro implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String descricao;
    private String cor;
    @OneToOne
    @JoinColumn(name = "modelo_codigo")
    private Modelo modelo = new Modelo();
    @OneToOne
    @JoinColumn(name = "marcaCarro_codigo")
    private MarcaCarro marcaCarro = new MarcaCarro();
    private String placa;
    private String ano;
    @ManyToOne
    @JoinColumn(name = "cliente_codigo")
    private Cliente cliente = new Cliente();

Um cliente pode ter varios carros e varios carros podem ter apenas um cliente.

Na minha cabeça penso da seguinte maneira, ter uma pagina de cadastro apenas de carro, com o crud completo! Depois na minha outra pagina de adicionar cliente, quero ter uma lista de carro que pode ser em selectMenu ou tabela mesmo, para poder adicionar um cliente e seus carros correto? Mais do jeito que eu modelei as classes, na hora de adicionar um carro, vou ter que adiconar um cliente também. E a minha intenção é adiconar apenas os carros e depois na minha tabela de cliente adicionar um cliente e escolher os carros cadastrado. Oque devo mudar?

Ou adiciono o cliente primeiro e depois na tela de carro eu faço algum campo tipo selectOneMenu ou uma tabela para o cliente?

3 respostas

Fala Alisson, tudo bem ?

Se quando você adiciona um carro não necessita de um cliente (se carros podem existir no sistema sem ter cliente), você poderia deixar a referência de Carro na classe Cliente vazia (tirar o new Cliente() do atributo cliente na classe Carro). Se for devidamente previsto não será problema deixar a referência nula.

Caso não queira deixar a referência vazia, pode repensar a modelagem. Precisa de fato que a classe Carro aponte para o Cliente? Poderia pensar em deixar o mapeamento unidirecional de Cliente para uma lista de Carro, apenas. Fica mais chato de buscar um Cliente através de um determinado Carro, mas pode ser válido.

Você poderia cadastrar os carros sem o cliente. E quando for cadastrar o cliente buscar os carros selecionados na base e adicionar na lista antes de persistir o cliente. No caso unidirecional ja seria suficiente. Mas se quiser continuar mapeando nas duas pontas além de adicionar o carro na lista e persistir o cliente, você deve adicionar o determinado cliente ao carro e fazer um merge por exemplo.

Espero ter ajudado no pensamento.

Muito bom Rafael, e como seria o mappeamento da forma que você me falou?

Esse trecho de texto que você me explicou, é isso que eu penso em fazer, você acertou em cheio.


Você poderia cadastrar os carros sem o cliente. E quando for cadastrar o cliente buscar os carros selecionados na base e adicionar na lista antes de persistir o cliente


Como ficaria o mapeamento dessa forma um relacionamento unidirecional.

Fazendo do seu jeito aonde que fica o relacionamento?

solução!

Fala Alisson, tudo bem ?

Ficaria algo como:

@Entity
@SuppressWarnings("serial")
public class Cliente implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    ...
    //atributos omitidos
     ...
    @OneToMany
    private List<Carro> carros = new ArrayList<Carro>();

e

@Entity
@SuppressWarnings("serial")
public class Carro implements Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    ...
   // aqui não precisaria da relação com o Cliente
   // a relação fica unidirecional, de Cliente para Carro