Doubts the database relationship of an application using spring boot

0

I am developing an application that aims to register a supplier, in which this supplier is generic (it can be a snack shop, building material store, a pharmacy ... etc) in which it will provide products on the web platform. However, for the final customer to be easy to find the product you want, I assign category to the supplier, to specify what kind of category the supplier fits, so my doubt is: how do I link subcategories according to the type of supplier . Ex: If the admin has registered the pharmacy supplier, the user responsible for the pharmacy when registering their products in the platform will have to choose only the subcategories linked to the pharmacy (hygiene / supplements / remedies / others ... etc).

Product registration screen for each supplier.

Inshort,ifapharmacysupplierisloggedin,theproductregister,insubcategoriesistoshowthesubcorrespondingtothepharmacy,ifitisaloggedinrestaurant,thesubdisplayedwillcorrespondtorestaurants.

ModelUser:

packagecom.bigboss.comprafacil.models;@EntitypublicclassUsuarioimplementsUserDetails,Serializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValueprivateLongid;@NotBlank(message="Nome é uma informação obrigatória.")
@Size(min = 2, max = 30)
private String nome;
private String nomeFantasia;
@NotBlank(message = "Rua é uma informação obrigatória.")
private String rua;
@NotBlank(message = "Bairro é uma informação obrigatória.")
private String bairro;
private String complemento;
@NotBlank(message = "Estado é uma informação obrigatória.")
private String estado;
@NotBlank(message = "Cidade é uma informação obrigatória.")
private String cidade;
@NotBlank(message = "É uma informação obrigatória.")
private String cnpjCpf;
@NotBlank(message = "Telefone é uma informação obrigatória.")
private String telefone;
public String categoria;
@NotBlank(message = "E-mail é uma informação obrigatória.")
@Email(message = "Não é um e-mail válido")
private String email;
@NotBlank(message = "Senha é uma informação obrigatória.")
private String senha;
@ManyToMany
@JoinTable( 
        name = "usuarios_roles", 
        joinColumns = @JoinColumn(
          name = "usuario_id", referencedColumnName = "email"), 
        inverseJoinColumns = @JoinColumn(
          name = "role_id", referencedColumnName = "nomeRole")) 
private List<Role> roles;
public List<Role> getRoles() {
    return roles;
}

public void setRoles(List<Role> roles) {
    this.roles = roles;
}

public String getCategoria() {
    return categoria;
}

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public void setCategoria(String categoria) {
    this.categoria = categoria;
}

public String getEstado() {
    return estado;
}

public void setEstado(String estado) {
    this.estado = estado;
}

public List<Produto> getProdutos() {
    return produtos;
}

public void setProdutos(List<Produto> produtos) {
    this.produtos = produtos;
}

@Enumerated(EnumType.STRING)
public Status status;

public Usuario() {
    status = Status.ATIVO;
}

@ManyToMany
@JoinTable(name = "usuarios_produtos", joinColumns = @JoinColumn(name = "usuario_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "produto_id", referencedColumnName = "id"))
private List<Produto> produtos;

public String getNome() {
    return nome;
}

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

public String getNomeFantasia() {
    return nomeFantasia;
}

public void setNomeFantasia(String nomeFantasia) {
    this.nomeFantasia = nomeFantasia;
}

public String getRua() {
    return rua;
}

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

public String getBairro() {
    return bairro;
}

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

public String getComplemento() {
    return complemento;
}

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

public String getCidade() {
    return cidade;
}

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

public String getCnpjCpf() {
    return cnpjCpf;
}

public void setCnpjCpf(String cnpjCpf) {
    this.cnpjCpf = cnpjCpf;
}

public String getTelefone() {
    return telefone;
}

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

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 Status getStatus() {
    return status;
}

public void setStatus(Status status) {
    this.status = status;
}

public static long getSerialversionuid() {
    return serialVersionUID;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    // TODO Auto-generated method stub
    return (Collection<? extends GrantedAuthority>) this.roles;
}

@Override
public String getPassword() {
    // TODO Auto-generated method stub
    return this.senha;
}

@Override
public String getUsername() {
    // TODO Auto-generated method stub
    return this.email;
}

@Override
public boolean isAccountNonExpired() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isAccountNonLocked() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isEnabled() {
    // TODO Auto-generated method stub
    return true;
}

}

Product model:

package com.bigboss.comprafacil.models;

@Entity
public class Produto implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false, length = 100)
@NotBlank(message = "Nome é uma informação obrigatória.")
public String nome;
@Column(nullable = false, length = 100)
@NotBlank(message = "Descrição é uma informação obrigatória.")
public String descricao;
@Column(nullable = false, length = 100)
@NotBlank(message = "Codigo do produto é uma informação obrigatória.")
public int codigoProduto;
@Column(nullable = false, length = 100)
@NotBlank(message = "Categoria é uma informação obrigatória.")
public String categoria;
@Column(nullable = false, length = 100)
@NotBlank(message = "Unidade de medida é uma informação obrigatória.")
public String unidadeMed;
@Column(nullable = false, length = 100)
@Enumerated(EnumType.STRING)
public Status status;
@NotBlank(message = "Preço é uma informação obrigatória.")
public String preco;

public String getPreco() {
    return preco;
}

public void setPreco(String preco) {
    this.preco = preco;
}

@ManyToMany(mappedBy = "produtos", cascade = CascadeType.ALL)
private List<Usuario> usuarios;


public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public List<Usuario> getUsuarios() {
    return usuarios;
}

public void setUsuarios(List<Usuario> usuarios) {
    this.usuarios = usuarios;
}

public Produto() {
    status = Status.ATIVO;
}

public String getNome() {
    return nome;
}

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

public String getDescricao() {
    return descricao;
}

public void setDescricao(String descricao) {
    this.descricao = descricao;
}

public int getCodigoProduto() {
    return codigoProduto;
}

public void setCodigoProduto(int codigoProduto) {
    this.codigoProduto = codigoProduto;
}

public String getCategoria() {
    return categoria;
}

public void setCategoria(String categoria) {
    this.categoria = categoria;
}

public String getUnidadeMed() {
    return unidadeMed;
}

public void setUnidadeMed(String unidadeMed) {
    this.unidadeMed = unidadeMed;
}

public Status getStatus() {
    return status;
}

public void setStatus(Status status) {
    this.status = status;
}

public static long getSerialversionuid() {
    return serialVersionUID;
}

}

Form provider:

                          Providers             Supplier Registration              

<section class="forms">
    <form th:object="${usuario}" th:action="@{/fornecedor/save}"
        method="POST" enctype="multipart/form-data">
        <!--Input responsável em guardar o id-->

        <div class="container-fluid">
        <th:block th:include="/mensagemValidacao :: mensagem"></th:block>
            <div class="row">
                <input id="id" name="id" type="hidden" th:field="*{id}"
                    th:value="*{id}">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label>Nome do empreendimento:</label> <input type="text"
                            name="nome" th:field="*{nome}" id="inputNome"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Nome fantasia:</label> <input type="text"
                            name="nomeFantasia" th:field="*{nomeFantasia}"
                            class="form-control" id="inputNomeFantasia">
                    </div>
                    <div class="form-group">
                        <label>Rua:</label> <input type="text" name="rua"
                            th:field="*{rua}" id="inputRua" class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Bairro:</label> <input type="text" name="bairro"
                            th:field="*{bairro}" id="inputBairro" class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Complemento:</label> <input type="text" name="complemento"
                            th:field="*{complemento}" id="inputComplemento"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Cidade:</label> <input type="text" name="cidade"
                            th:field="*{cidade}" id="inputCidade" class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Estado:</label> <select name="estado" class="form-control"
                            th:field="*{estado}" id="inputEstado">
                            <option th:value="AC">Acre</option>
                            <option value="AL">Alagoas</option>
                            <option value="AP">Amapá</option>
                            <option value="AM">Amazonas</option>
                            <option value="BA">Bahia</option>
                            <option value="CE">Ceará</option>
                            <option value="DF">Distrito Federal</option>
                            <option value="ES">Espírito Santo</option>
                            <option value="GO">Goiás</option>
                            <option value="MA">Maranhão</option>
                            <option value="MT">Mato Grosso</option>
                            <option value="MS">Mato Grosso do Sul</option>
                            <option value="MG">Minas Gerais</option>
                            <option value="PA">Pará</option>
                            <option value="PB">Paraíba</option>
                            <option value="PR">Paraná</option>
                            <option value="PE">Pernambuco</option>
                            <option value="PI">Piauí</option>
                            <option value="RJ">Rio de Janeiro</option>
                            <option value="RN">Rio Grande do Norte</option>
                            <option value="RS">Rio Grande do Sul</option>
                            <option value="RO">Rondônia</option>
                            <option value="RR">Roraima</option>
                            <option value="SC">Santa Catarina</option>
                            <option value="SP">São Paulo</option>
                            <option value="SE">Sergipe</option>
                            <option value="TO">Tocantins</option>
                        </select>
                    </div>
                </div>

                <div class="col-lg-6">
                    <div class="form-group">
                        <label>CPF/CNPJ:</label> <input type="text" placeholder=""
                            th:field="*{cnpjCpf}" id="inputcnpjCpf" name="cnpjCpf"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Telefone:</label> <input type="text" placeholder=""
                            th:field="*{telefone}" id="inputTelefone" name="telefone"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Categoria:</label> <select name="categoria"
                            class="form-control" th:field="*{categoria}" id="inputCategoria">
                            <option value="Farmarcias">Farmacias</option>
                            <option value="Lanchonetes">Lanchonetes</option>
                            <option value="Material de construçao">Material de
                                Construçao</option>
                            <option value="Restaurantes">Restaurantes</option>
                            <option value="Pizzarias">Pizzarias</option>

                        </select>
                    </div>
                    <div class="form-group">
                        <label>Adicionar foto do perfil:</label> <input type="file"
                            name="" class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Email:</label> <input type="email" name="email"
                            th:field="*{email}" id="inputEmail" class="form-control"
                            placeholder="[email protected]">
                    </div>
                    <div class="form-group">
                        <label>Senha:</label> <input type="password" name="senha"
                            th:field="*{senha}" id="inputSenha" class="form-control"
                            placeholder="Mínimo 6 caracteres">
                    </div>
                    <div class="form-group">
                        <label>Confirmar senha:</label> <input type="password"
                            placeholder="Mínimo 6 caracteres" name="senha"
                            class="form-control">
                    </div>
                </div>
                <div class="col-lg-12">
                    <button type="submit" class="btn btn-primary">Salvar</button>
                    <button type="reset" class="btn btn-danger"
                        onclick="window.location.href='/funcionarios/listar';">
                        Cancelar</button>
                </div>

            </div>
        </div>

    </form>
</section>
<script type="text/javascript">
    $(document).ready(function() {
        $(".dropdown-toggle").dropdown();
    });
</script>

Form products:

                          Products             Product Registration                                         

        <div class="container-fluid">
        <th:block th:include="/mensagemValidacao :: mensagem"></th:block>
            <div class="row">
                <input id="id" name="id" type="hidden" th:field="*{id}"
                    th:value="*{id}">
                <div class="col-lg-6">
                    <div class="form-group">
                        <label>Código do produto:</label> <input type="text"
                            name="codigoProduto" th:field="*{codigoProduto}" id="inputcodigoProduto"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Valor:</label> <input type="text"
                            name="preco" th:field="*{preco}"
                            class="form-control" id="inputPreco">
                    </div>
                    <div class="form-group">
                        <label>Nome:</label> <input type="text"
                            name="nome" th:field="*{nome}" id="inputNome"
                            class="form-control">
                    </div>
                    <div class="form-group">
                        <label>Descrição:</label> <textarea type="text" cols="40" rows="5" name="descricao"
                            th:field="*{descricao}" id="inputdescricao" class="form-control"></textarea>
                    </div>

                </div>

                <div class="col-lg-6">
                    <div class="form-group">
                        <label>Unidade de medida:</label> <select name="unidadeMed" class="form-control"
                            th:field="*{unidadeMed}" id="inputunidadeMed">
                            <option th:value="UND">UND</option>
                            <option value="CM">CM</option>
                            <option value="METRO">METRO</option>
                            <option value="PCT">PCT</option>
                            <option value="KG">KG</option>
                            <option value="LITRO">LITRO</option>
                            <option value="M²">M²</option>
                            <option value="M³">M³</option>
                            <option value="GRAMA">GRAMA</option>
                            <option value="MILIGRAMA">MILIGRAMA</option>
                            <option value="CAIXA">CAIXA</option>
                            <option value="OUTRO">OUTRO</option>
                        </select>
                    </div>

                    <div class="form-group">
                        <label>Sub-categorias:</label> <select name="categoria"
                            class="form-control" th:field="*{categoria}" id="inputCategoria">
                            <option value="Farmarcias">Higiene</option>
                            <option value="Lanchonetes">Suplementos</option>
                            <option value="Material de construçao">Remedios</option>
                            <option value="Restaurantes">Outros</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label>Adicionar foto do produto:</label> <input type="file"
                            name="" class="form-control">
                    </div>
                </div>
                <div class="col-lg-12">
                    <button type="submit" class="btn btn-primary">Salvar</button>
                    <button type="reset" class="btn btn-danger"
                        onclick="window.location.href='/funcionarios/listar';">
                        Cancelar</button>
                </div>

            </div>
        </div>
    </form>
</section>
<script type="text/javascript">
    $(document).ready(function() {
        $(".dropdown-toggle").dropdown();
    });
</script>

How to model the bank according to my need?

    
asked by anonymous 05.06.2018 / 17:15

1 answer

2

If I understand your need, follow the 'model':

  

SUPPLIERS (1 x 1)
  CATEGORIES (1 supplier has 1 category)
  CATEGORIES (n x 1)
  SUBCATEGORIES (VARIOUS SUBCATEGORIES FOR A CATEGORY)
  SUPPLIERS_CATEGORIES (n n) (multiple categories for multiple vendors)

so we would have the tables:

SUPPLIERS

idFornecedor (PK)
...

CATEGORY

idCategoria(PK)
...

SUBCATEGORIES

idSubcategoria (PK)
idCategoria (FK)
...

SUPPLIERS_CATEGORIES

-> CHAVE PRIMARIA COMPOSTA
idFornecedor(PK FK)
idCategoria(PK FK)
...
  

I have set the FORNECEDORES_CATEGORIAS table thinking about the possibility of a supplier being able to supply products of different categories.

So, for a supplier, just do:

SELECT * FROM FORNECEDORES_CATEGORIAS fc
INNER JOIN CATEGORIAS c ON c.idCategoria = fc.idCategoria
INNER JOIN SUBCATEGORIAS sub ON sub.idCategoria = fc.idCategoria
WHERE fc.idFornecedor = :idFornecedorLogado

This will bring all subcategories that the vendor would be 'subscribed to.'

    
11.06.2018 / 18:06