Como modelar essa Herança no Banco?

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?

1 curtida

@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"; 
}

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

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.

1 curtida

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”.

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 .

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

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.

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…

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.

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.