Melhorar a OO

7 respostas
kleins

Pessoal

Tenho um sistema com varios DAOs, mas sinto que dá pra melhorar o codigo deles...

Estou chamando a cada metodo um novo EntityMagager...

Como eu faria pra melhorar este código e não repetir tanto esse trecho do entity.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.org.system4.DAO;

import br.org.system4.entity.Code;
import java.math.BigDecimal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.transaction.UserTransaction;

/**
 *
 * @author rodrigo.klein
 */
public class CodeDAO {

public static void add(String ium, String status){
    
    Code c = new Code();
    c.setIum(ium);
    c.setStatus(status);
    persist(c);
    
    
    
    
}
  public static void add(String ium){
    
    Code c = new Code();
    c.setIum(ium);
    persist(c);
    
    
    
    
}  
    
public static Code getCodeByid(int id){
        
        Code code = null;
        
        try {


            BigDecimal bgid = BigDecimal.valueOf(Double.valueOf(String.valueOf(id)));

            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             code = (Code) em.createNamedQuery("Code.findById").setParameter("id", bgid).getSingleResult();
             
             

            
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return code;
    }
    
public static Code getCodeByIum(String ium){
            Code code = null;
        
        try {


            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             code = (Code) em.createNamedQuery("Code.findByIum").setParameter("ium", ium).getSingleResult();
   
             
             
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return code;
    }
    
    
    public static List getCodeByStatus(String status){
           
        List codeList = null;
        
        try {

            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             codeList = em.createNamedQuery("Code.findByStatus").setParameter("status", status).getResultList();
             
  
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return codeList;
    }


public static void persist(Object object) {
       
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.persist(object);
            utx.commit();
        } catch (Exception e) {
            System.out.println("Error :"+e.getMessage());
            throw new RuntimeException(e);
        }
    }

}

Valeu..

Abraço

7 Respostas

Jose_Donizetti

Voce pode passar ele por um construtor, ou mesmo injetar ele usando um metodo set…
Para isso voce deveria tambem instanciar suas classes daos por uma factory…pelo que percebi voce num está instanciando nenhum
DAO pq os metodos são todos static

peerless

Se isso for realmente um problema pra você, considere o uso de Aspectos.

Uma boa dica: Spring AOP

kleins

Olá Junior.

J_Junior:
Voce pode passar ele por um construtor, ou mesmo injetar ele usando um metodo set…
Para isso voce deveria tambem instanciar suas classes daos por uma factory…pelo que percebi voce num está instanciando nenhum
DAO pq os metodos são todos static

Não estou instanciando a DAO por que ainda estou testando eles, mas pretendo retirar os metodos static em breve.

Oque me incomoda é a repetição desse código pra chamar a entity,

Como eu faria pra criar uma DAOFactory ?

Esse conceito ainda é meio nebuloso pra mim…

abs

kleins

Valeu,

Vou dar uma pesquisada no assunto.

Abraço

peerless:
Se isso for realmente um problema pra você, considere o uso de Aspectos.

Uma boa dica: Spring AOP

sergiotaborda

kleins:
Pessoal

Tenho um sistema com varios DAOs, mas sinto que dá pra melhorar o codigo deles…

Se quer mesmo melhorar a OO :

  1. Use objetos. Vc está usado métodos estáticos por todo o lado isso não é OO
  2. Passe objetos de dominio como parametro e não Strings e ints.
  3. Chame o seu objeto de outra coisa que não inclua a sigla DAO ou, se vc acha mesmo que está usando o padrão DAO
    crie uma interface e faça seus DAO implementá-la
kleins

Encontrei uma doc sobre DAO e sobre Factory,

http://www.javafree.org/content/view.jf?idContent=183

Valeu.

abs

kleins

Mudei o código pra implementar DAO corretamente.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.org.system4.DAO;

import br.org.system4.entity.Code;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

/**
 *
 * @author rodrigo.klein
 */
public interface CodeDAOi {

public void save(Code code);
public void update(Code code);
public void delete(Code code);
public List getAllCodes();
public Code getCodebyId(BigDecimal id);
public Code getCodebyIum(String Ium);
    
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.org.system4.DAO;

import br.org.system4.entity.Code;
import java.math.BigDecimal;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityExistsException;
import javax.persistence.EntityManager;
import javax.transaction.UserTransaction;

/**
 *
 * @author rodrigo.klein
 */
public class CodeDAOjpa implements CodeDAOi {


    
public List getCodeByStatus(String status){
           
        List codeList = null;
        
        try {

            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             codeList = em.createNamedQuery("Code.findByStatus").setParameter("status", status).getResultList();
             
  
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAOjpa.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return codeList;
    }


private void persist(Object object) {
       
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.persist(object);
            utx.commit();
        } catch (Exception e) {
            System.out.println("Error :"+e.getMessage());
            throw new RuntimeException(e);
        }
    }

private void merge(Object object) {
       
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.merge(object);
            utx.commit();
        } catch (Exception e) {
            System.out.println("Error :"+e.getMessage());
            throw new RuntimeException(e);
        }
    }

public void save(Code code) {

        try {
            
                persist(code);
        
        } catch (Exception e){
                System.out.println("Error ::"+e.getMessage());
                
                
        }

        
        
    }
public void update(Code code) {
         try {
            
                merge(code);
        
        } catch (Exception e){
                System.out.println("Error ::"+e.getMessage());
                
                
        }
    }
public void delete(Code code) {
       try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");
            em.remove(code);
            utx.commit();
        } catch (Exception e) {
            System.out.println("Error :"+e.getMessage());
            throw new RuntimeException(e);
        }
        
        
        
        
    }

public List getAllCodes() {
        
        List codeList = null;
        
        try {

            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             codeList = em.createQuery("SELECT c FROM Code c").getResultList();
             
  
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAOjpa.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return codeList;
        
        
    }

    public Code getCodebyId(BigDecimal id) {
        
        Code code = null;
        
        try {

            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             code = (Code) em.createNamedQuery("Code.findById").setParameter("id", id).getSingleResult();
             
             

            
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAOjpa.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return code;
        
        
        
    }

    public Code getCodebyIum(String Ium) {
                    Code code = null;
        
        try {


            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/LogicalName");

             code = (Code) em.createNamedQuery("Code.findByIum").setParameter("ium", Ium).getSingleResult();
   
             
             
        } catch (NamingException ex) {
            Logger.getLogger(CodeDAOjpa.class.getName()).log(Level.SEVERE, null, ex);
        }
    
    
        return code;
    }
    

    

}
Criado 4 de julho de 2008
Ultima resposta 4 de jul. de 2008
Respostas 7
Participantes 4