Esta e Melhor Maneira de Fazer?

6 respostas
R

Pessoal tenho duas Classes, Usuarios e Niveis de Usuarios da seguinte forma:

// Definindo as Named Queryes.
@NamedQueries({
    
    @NamedQuery ( name   =   "EntUsNivel.DescNivel",     query  =   "from EntUsNivel nv where nv.niv_descricao = :descricao"),

    @NamedQuery ( name   =   "EntUsNivel.CarregaNivel",  query  =   "from EntUsNivel nv order by nv.niv_descricao")

})

// Definindo os Dados da Tabela.
@Entity
@Table( name= "usu_nivel" )
@SequenceGenerator( name = "nome_seq", sequenceName = "niv_codigo", allocationSize = 1, initialValue = 1 )

public class EntUsNivel implements java.io.Serializable {
    
    private static final long serialVersionUID = 1L;
    
    // Definindo as Colunas do Banco de Dados.
    @Id
    @GeneratedValue(generator="nome_seq")
    private Integer     niv_codigo;
    
    @Column(name= "niv_descricao", length = 50)
    private String      niv_descricao;

    
    
    public EntUsNivel(){
        
    }

    // Metodos Construtor.

E a Classe de Usuarios :

// Definindo as Named Queryes.
@NamedQueries({
    
    @NamedQuery ( name  =  "usu_UsuariosLogin",         query = "from EntUsUsuarios usu where usu.usu_login = :lg and usu.usu_senha = :pw" ),
    
    @NamedQuery ( name  =  "usu_UsuariosCarregar",      query = "from EntUsUsuarios usu"),
        
    @NamedQuery ( name  =  "usu_UsuariosCondicao",      query = "from EntUsUsuarios usu where usu.usu_codigo = :usu_codigo")

})


// Definindo os Dados da Tabela.
@Entity
@Table( name = "usu_usuarios" )
@SequenceGenerator( name = "nome_seq", sequenceName = "usu_codigo", allocationSize = 1, initialValue = 1 )


public class EntUsUsuarios implements java.io.Serializable{
    
    private static final long serialVersionUID = 1L;
    
    // Definindo as Colunas do Banco de Dados.
    @Id
    @GeneratedValue(generator="nome_seq")
    private Integer     usu_codigo;
    
    @Column(length = 100)
    private String      usu_nome;
    
    @Column(length = 50)
    private String      usu_login;
    
    @Column(length = 32)
    private String      usu_senha;
    
    @Column
    private int         usu_ativo;
   
    @Column( nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date        usu_dtexpira;
    
    @Column( nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date        usu_dtcadastro;    
    
    @Column( nullable = true)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date        usu_dtalteracao;
  
    
    
    @OneToOne
    @JoinColumn(name = "usu_cod_nivel", nullable = true)
    private EntUsNivel  usu_cod_nivel;
    
    
    
    
    
    
    public EntUsUsuarios(){
        
    }

A Pergunta e a Seguinte, estou fazendo da melhor maneira, pois cada usuario deve ter somente um nivel de usuario, por isso implementei onetoone.
Na hora de salvar estou fazendo assim :

try
        {
         
            // Instanciando o Nivel de Usuarios.
            EntUsNivel  nivelUsu = new EntUsNivel();
            
            // Verificar se Existe Algo na Combo.
            if(cbNivel.getSelectedIndex()!= -1){
                
                
                // Pegar o Grupo de Usuarios.);
                Query nivel     = ses.getNamedQuery("EntUsNivel.DescNivel").setString("descricao", cbNivel.getSelectedItem().toString());
                nivelUsu        = (EntUsNivel) nivel.uniqueResult();
              }
            
            // Instanciando os Usuarios.
            EntUsUsuarios usuarios  = new EntUsUsuarios();
            
            // Repassando os Dados do Usuario.
            usuarios.setUsu_nome(txNome.getText());
            usuarios.setUsu_login(txLogin.getText());
            usuarios.setUsu_senha(txsenha.getText().toUpperCase());
            
            // Se Estiver Incluindo Dados.            
            if(Operacao == 1)                
                usuarios.setUsu_dtcadastro(funcoes.FStringToDate(txDtCadastro.getText()));
            
            // Se Estiver Alterando Dados.
            if(Operacao == 2)
                usuarios.setUsu_dtalteracao(funcoes.FStringToDate(txDtAlteracao.getText()));
            
            usuarios.setUsu_dtexpira(funcoes.FStringToDate(txDtAlteracao.getText()));
            
            // Configurar se o Usuario Esta Ativo ou nao.
            if(cbAtivo.isSelected())
                usuarios.setUsu_ativo(1);
            
            
            // Se o Nivel nao For Nulo.
            if(nivelUsu.getNiv_codigo()  != null){
                usuarios.setUsu_cod_nivel(nivelUsu);           
            }
           
            // Instanciando a Classe DAO de Usuarios.            
            usUsuariosDAO userDao = new usUsuariosDAO();
            
            
            // Se Estiver Incluindo Dados
            if(Operacao == 1){
                userDao.IncluirUsuario(usuarios);
            }

O que nao estou gostando e que tenho que toda vez fazer uma consulta sql para pegar o nivel de usuario, gostaria de saber se existe outra forma de fazer isso ? Obrigado a todos, forte abraco.

6 Respostas

aeciovc

faça um Dao pra cada Entidade.

UsuarioDAO
NivelDAO

e então

pelo que vi você deve estar trabalhando com JSE + Swing, no lugar de carregar os textos no Combo de Nível carregue uma Lista de Objetos Nível.

R

Caro amigo, tenho um DAO para cada entidade mais sou novato em Hibernate, na verdade esta e minha primeira tentativa e nao estou conseguindo fazer o que voce me solucionou, estou fazendo um programinha para desktop, como faco para carregar uma lista com objetos nivel para facilitar a minha vida ? E na entidade de usuarios ? Obrigado pela sua ajuda um abraco, fico no aguardo.

aeciovc

veja... se hoje pra carregar você faz mais o menos isso:

ResultSet rs = statement.executeQuery(sql);
//...
//...
while(rs.next())
 combo.addItem( rs.getString() );

//...
//...

você fará isso:

ArrayList<Nivel> listaNiveis;
listaNiveis = NivelDAO.getNiveis();

for (Nivel nivel : listaNiveis ){

combo.addItem(nivel);

}

OBS: dá uma olhada na sintaxe pode existir algo errado, mas a idéia é preencher o Combo com os objetos Nivel de uma Lista que é disponibilizada pelo seu DAO.

R

Na verdade o que deseja implementar e uma maneira de salvar os dados mais facilmente, sem ter que realizar uma pesquisa SQL, para saber a chave do Nivel de Usuario, Teria uma maneira do Hibernate fazer isto por mim ?

Hebert_Coelho

Eu vi que, sua classe para detalhar o papel do usuário só tem uma String.

Ao invés criar uma classe só para isso, pq vc não utilizar um enum?

Creio que será mais simples e mais fácil para você codificar.

public enum PapelUsuario{ ADMIN,USER,MANAGER; }
Nesse post você pode ver como é simples salvar um Enum: Mapeando Datas (Date) e Enum.

R

Caro amigo, ja pensei em Enum, mais na verdade eu quero deixar aberto para se caso o usuario quiser por exemplo criar um novo tipo de usuario no sistema, ele tenha esta opcao, por isso decidi criar uma base de dados para isso.Agradeco demais a ajuda e ainda estou no aguardo por uma outra opcao.

Criado 12 de janeiro de 2012
Ultima resposta 13 de jan. de 2012
Respostas 6
Participantes 3