Como modelar essa Herança no Banco?

10 respostas Resolvido
java
P

A classe User é abstrata e existe apenas estes dois atributos. As classes que herdam servem apenas para diferenciá-los e não possuem atributos diferentes. Como criar essa tabela User no banco? Melhor… depois quando precisar buscar os dados no banco…como saber quem é admin ou um usuário normal?

10 Respostas

D
Solucao aceita

@picklesdog70

Fiz algo parecido no meu projeto, não sei se está da forma correta, vê se te ajuda em algo:

veja as imagens utilizando Servlet :

O mesmo projeto so que utilizando Struts : Gitub .

Modelagem :

Tabelas do Banco:

na minha tabela USUARIO eu tenho um campo chamado TIPO , esté campo ira conter a informação se ele é um UsuarioVip ou UsarioNormal.

na minha pagina fiz assim :

<form action="InserirUsuarioForm.do" method="POST">
                    Tipo de Usuários<br />

    <input type="radio" name="rdbTipo"  id="tipoVip" value="UsuarioVip"/>
    <label for="tipoVip">Usuário Vip</label> <br />

    <input type="radio" name="rdbTipo" id="tipoNormal" value="UsuarioNormal"/>
    <label for="tipoNormal">Usuário Normal</label> <br />
</form>

O metodo incluir do DAO :

@Override 
    public void incluir(Usuario entidade) throws SQLException { 
        
        stm = conexao.prepareStatement("INSERT INTO USUARIO VALUES (?,?,?,?,?,?)"); 
 
        stm.setString(1, entidade.getLogin()); 
        stm.setString(2, entidade.getSenha()); 
        stm.setString(3, entidade.getNome()); 
        stm.setString(4, entidade.getTelefone()); 
        stm.setString(5, entidade.getEmail()); 
        stm.setString(6, entidade.getClass().getSimpleName()); // aqui ele ira pega o nome da classe 
 
        stm.executeUpdate(); 
        stm.close(); 
    }

Controller:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
       
        RequestDispatcher view = null; 
        Usuario usuario = null; 
        String mensagem = null; 
        DAOFactory df = null; 
         
      InterfaceDAOUsuario daoUsuario = null; 
         
        try { 

            df = DAOFactory.getDaoFactory(DAOFactory.ORACLE);  
            daoUsuario = df.getDAOUsuario(); 

            // aqui faz a verificação de qual tipo será armazenado 
            if(request.getParameter("rdbTipo").equals("UsuarioVip")) { 
                usuario = new UsuarioVip(); 
            } else { 
                usuario = new UsuarioNormal(); 
            } 
             
            usuario.setLogin(request.getParameter("txtLogin")); 
            usuario.setSenha(request.getParameter("txtSenha")); 
            usuario.setNome(request.getParameter("txtNome")); 
            usuario.setTelefone(request.getParameter("txtTelefone")); 
            usuario.setEmail(request.getParameter("txtEmail")); 
             
            daoUsuario.incluir(usuario); 
            request.setAttribute("user", usuario); 
             mensagem = "Inclusão de Usuario realizada com sucesso"; 
}
P

Eu não vejo por que usar um “dao usuario”.

O DAO deveria retornar o objeto certo, e usar polimorfismo pra retornar uma interface ou subclasse adequada.

Pra criar o usuario certo basta usar um padrão de criação como Factory e fabricar a coisa certa.

Se vc precisa criar o objeto q partir do form, use a factory adequada.

À lógica do que é esse objeto esta na camada MODEL e existe um detalhe da infraestrutura que serializa isso no banco. O que pode dificultar é usar um objeto pra receber o form – ai nao sei como resolver pq sou um homem das cavernas que não usa as coisas mais recentes

J

Isso é solução acadêmica, na prática só vai te trazer complicação técnica. Eu colocaria um campo booleano admin na tabela User, se é este o caso de controlar quem é administrador de forma fixa. A solução mais abrangente costuma ser com tabelas de perfis x permissões, mas considerei seu cenário.

P

Dependendo da modelagem é melhor ter

metodoQqCoisa(Admin admin){…}

Do que la dentro vc fazer if admin == true, else, etc

Perceba que isso não é escrito em pedra.

E as vezes vc tem algo como CATEGORIAS bem diferentes de usuarios que um simples boolean não resolve.

Mas é um “as vezes”.

D

O daoUsuario é o que contem os métodos para o crud.
Isso era um trabalho da faculdade, onde o professor ensinou desta forma.
O único padrão que estou usando é o Dao do jee .

P

Entendi… mas… confesso que realmente não gostaria de meter um if para verificar se o cara é admin ou não…

J

Entendo que não quer if. Mas como você vai saber se um usuário é da classe Admin? Vai ter que haver uma consulta de qualquer forma, se vai numa tabela diferente ou num campo, não faz diferença pra funcionalidade.

P

Você está certo…não vou ter para onde correr…vou utilizar a idéia do Daniel_Dias… criei um atributo na classe abstrata User… e no momento da autenticação é criado um UserNormal… se depois de verificar no banco que é um UserAdmim, faço a mudança…

J

Exato, ai fica como uma escolha técnica que você vai levar na vida da sua aplicação. Importante para a empresa é que os dados compartilhados pelos tipos de usuário estarão sem complicação numa mesma tabela no banco de dados. De uma forma ou de outra a informação terá que ser consultada no banco relacional obedecendo condições (ou ifs como quer chamar), independente se a aplicação “A” usa modelagem orientada a objetos e fica se preocupando com mapeamentos/truques de mágicas, ou se a aplicação “B” simplesmente faz direto um SQL para retornar o resultado da funcionalidade.

P

Banco relacionais não lidam com objetos (e herança), lidam com relações. Se quer saber como mapear sua estrutura de objeto para o modelo relacional, a resposta vai depender do que vc usa na camada ORM.

Criado 30 de outubro de 2016
Ultima resposta 31 de out. de 2016
Respostas 10
Participantes 5