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

duvida sobre compra.

Opa beleza no meu sistema to fazendo um controle de venda por exemplo compra venda um controle doque gasto em comprar doque venda correto? Então na minha classe produto;

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private Integer quantidade;
    private Double preco;
    @ManyToOne
    @JoinColumn(name = "fornecedor_codigo")
    private Fornecedor fornecedor = new Fornecedor();
    @OneToOne
    @JoinColumn(name = "marca_codigo")
    private Marca marca = new Marca();

    public Long getCodigo() {
        return codigo;
    }
    public void setCodigo(Long codigo) {
        this.codigo = codigo;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public Integer getQuantidade() {
        return quantidade;
    }
    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }
    public Double getPreco() {
        return preco;
    }
    public void setPreco(Double preco) {
        this.preco = preco;
    }
    public Fornecedor getFornecedor() {
        return fornecedor;
    }
    public void setFornecedor(Fornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }
    public Marca getMarca() {
        return marca;
    }
    public void setMarca(Marca marca) {
        this.marca = marca;
    }
}

até aqui tudo bem agora queria fazer uma tabela de compra, que seria o produto comprado com a quantidade pedido, e depois queria mostrar a data essas coisas, então fiz minha tabela Compra;

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codido;
    private Double precoTotal;
    private Calendar Data = Calendar.getInstance();
    @OneToMany
    @JoinColumn(name = "produto_codigo")
    private List<Produto> produtos = new ArrayList<Produto>();

    public Long getCodido() {
        return codido;
    }
    public void setCodido(Long codido) {
        this.codido = codido;
    }
    public Double getPrecoTotal() {
        return precoTotal;
    }
    public void setPrecoTotal(Double precoTotal) {
        this.precoTotal = precoTotal;
    }
    public Calendar getData() {
        return Data;
    }
    public void setData(Calendar data) {
        Data = data;
    }
    public List<Produto> getProdutos() {
        return produtos;
    }
    public void setProdutos(List<Produto> produtos) {
        this.produtos = produtos;
    }    


}

Ok minha compra pode ter varios produtos. Então aqui vem minha duvida, não queria fazer a fk na minha tabela de produto correto? porque não queria que tivesse uma fk dentro do meu produto de compras não faz sentido, eu queria que na minha compra tivesse a fk de produtos tendeu? Como fazer do jeito certo, porque fiz dessa maneira e na minha tabela de compra não tem nenhum relacionamento com produto :( ou está correto assim mesmo?

6 respostas

Essa sua dúvida é bem parecida com essa outra

https://cursos.alura.com.br/forum/topico-criacao-da-tabela-do-jeito-correto-34293

Recomendo uma revisão sobre modelagem de banco de dados relacionais, e cardinalidade dos relacionamentos.

Alisson, para realizar a criação da tabela de compra, controle de datas e estoque você primeiramente deve criar uma tabela para armazenar os dados principais da compra:

create table compra (
    id bigint not null auto_increment,
    idcliente integer not null,
    idusuario integer not null,
    data timestamp not null,
    // ....
);

Com isso temos duas FK, a primeira seria para gravar o cliente que esta comprando e a segunda o usuário que esta fazendo a venda.

Feito isso, precisamos ter uma outra tabela para controlar os produtos vendidos e futuramente fazer o controle de estoque:

create table compra_itens (
    id bigint not null auto_increment,
    idcompra bigint not null,
    idproduto integer not null,
    quantidade numeric(18,2) not null,
    valor numeric(18,2) not null,
    // ...
);

Aqui juntamos a tabela de itens com a tabela de compra, informando o produto que esta sendo vendido, a quantidade e o valor.

Basicamente a idéia é essa, tem como melhorar ainda mais e adicionar mais informações nas tabelas.

Espero ter ajudado.

Muito boa a explicação Matheus me ajudo de mais a exclarecer, poderia me tirar uma outra duvida? você conhece sobre hibernate? No código java puro mesmo? Se conhecer me ajuda, mais se não não tem problema.

Chego na parte que eu realmente quero entender como funciona o relacionamento oneToMany e ManyToOne. Porque tenho no meu produto a tabela desse jeito.

  @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private Integer quantidade;
    private Double preco;
    private Double precoAVender;
    @OneToMany
    private List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();
    @OneToOne
    @JoinColumn(name = "marca_codigo")
    private Marca marca = new Marca();

Reparem que eu coloquei um OneToMany aqui no meu fornecedores porque a lógica pra mim é que sempre um produto pode ter varios fornecedores diferentes, ou seja varios fornecedores tem o mesmo produto! Mais fazendo dessa forma com essa anotação a minha tabela de produto só vai ter a fk da marca e eu queria que no meu produto tivesse a fk da marca e do fornecedor, dessa forma não é possivel fazer? Quando coloca OneToMany sempre a outra tabela vai receber o lado "forte" da relação? Porque fiz desse jeito e oque aconteceu foi que na tabela fornecedor tem a fk do produto, mas queria ao contrario...

 @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String nome;
    private Integer quantidade;
    private Double preco;
    private Double precoAVender;
    @OneToMany
    @JoinColumn(name = "fornecedor_codigo")
    private List<Fornecedor> fornecedores = new ArrayList<Fornecedor>();
    @OneToOne
    @JoinColumn(name = "marca_codigo")
    private Marca marca = new Marca();
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    private String celular;
    private String nome;
    private String email;
    private String razaoSocial;
    @ManyToOne
    private Produto produto = new Produto();

Alguma solução para o meu "problema"?

solução!

Alisson, o mapeamento de tabelas sempre é feito na classe que possui a FK, ou seja, todos os mapeamentos serão feitos na classe Compra(responsável por mapear a tabela compra), ficaria da seguinte maneira:

@Entity
@Table(name = "compra")
public class Compra implements Serializable {

    private Long id;
    @ManyToOne
    @JoinColumn(name = "idcliente", referencedColumnName = "id", nullable = false);
    private Cliente idcliente;
    @ManyToOne
    @JoinColumn(name = "idusuario", referencedColumnName = "id", nullable = false);
    private Usuario idusuario;
    private Calendar data;

}

Veja que estamos mapeando os objetos Cliente e Usuario dentro de nossa Compra, assim conseguimos criar a mesma FK existente na tabela compra.

A mesma idéia segue para a tabela compra_itens:

@Entity
@Table(name = "compra_itens")
public class CompraItens implements Serializable {

    private Long id;
    @ManyToOne
    @JoinColumn(name = "idcompra", referencedColumnName = "id", nullable = false);
    private Compra idcompra;
    @ManyToOne
    @JoinColumn(name = "idproduto", referencedColumnName = "id", nullable = false);
    private Produto idproduto;
    private Double quantidade;
    private Double valor;

}

Espero ter ajudado.

boaa. Obrigado de novo!

De nada, sempre que precisar estamos por aqui.