Pregunta

mi pregunta es: ¿Está su capa de servicios destinada a Tecnology utiliza

Por ejemplo, si el uso de hibernación, que pone en su capa de servicios algunos HQL-consultas o criterios-consultas que sólo son características hibernan o le llamará simplemente DAO (DAO y tiene aplicación hibernación, y la aplicación tal vez JDBC, etc ..) ?

Tengo algunos problemas para construir una arquitectura en capas eficiente para mi software.

Editar Este es un servicio sencillo ... creo que es un servicio ... sin límite a tecnlogy i usando (hibernación)

@Repository
public class PersonHibernateDAO implements PersonDAO {

    @Autowired
    SessionFactory sessionFactory;

    ... dao crud operations(implementation of PersonDAO interface) using sessionfactory ...

    //and some hibernate features methods
    public Person findByCriteria(Criterion criterion){
        // code
    }
}

@Service
public class PersonService {

    @Autowired
    private PersonDAO personDao;

    @Autowired
    private AccessDAO accessDao;

    @Transactional
    public boolean hasPermission(String username, String accessCode){
        Person p=personDao.findByUsername(username);
        Access a=accessDao.findByCode(accessCode);
        ... etc ...
    }
}

Y este es un servicio con la implementación uso Dao

@Service
public class PersonService {

    @Autowired
    private PersonDAO personDao;

    @Autowired
    private AccessDAO accessDao;

    @Transactional
    public boolean hasPermission(String username, String password){
        Person p=((PersonHibernateDao)personDao).findByCriteria(Restrictions.eq("username", username);
        ... etc ...
    }
}

Cuales de estos dos enfoque es correcto?


Edit2

Así que, para resumir lo que he entendido:

// BASE DAO INTERFACE
public interface DAOInterface<EntityClass, IDType extends Serializable> {
    EntityClass get(IDType id);
    EntityClass findById(IDType id);
    EntityClass save(EntityClass entity);
    EntityClass update(EntityClass entity);
    void delete(EntityClass entity);
}

// AN HIBERNATE IMPLEMENTATION
public abstract class HibernateDAO<EntityClass, IDType extends Serializable> implements DAOInterface<EntityClass, IDType> {

    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory=sessionFactory;
    }

    public void getSessionFactory(){
        return this.sessionFactory;
    }

    // Implements all DAOInterface method using sessionFactory

}

// PERSON DAO INTERFACE
public interface PersonDAO extends DAOInterface<Person, Long>{

    Person findByName(String name, String surname);
    List<Person> getInAgeRange(int year1, int year2);
}

// PERSON HIBERNATE DAO IMPLEMENTATION
public PersonHDAO extends HibernateDAO<Person, Long> implements PersonDAO{

    // Implements the methods of PersonDAO interface using sessionFactory
}

@Service
public class PersonService {

    //spring inject the correct DAO by its xml config(in this case PersonHDAO
    @Autowired
    private PersonDAO personDAO; 

    // spring manage the transaction
    @Transactional
    public List<Person> getInAgeRange(int year1, int year2){
        return personDAO.getInAgeRange(year1, year2);
    }

}

// NOW... HOW USE IT
//let's assume i have a button, pressing it a table will be populated with all persons in age range
private void actionPerfom(ActionEvent e){
    List<Person> list=personService.getInAgeRange(age1Spinner.getValue(), age2Spinner.getValue());
    //Load a table with list
}

Lo siento por este muro de texto, tal vez puede ser útil para los demás espero, im ir en la dirección correcta? Mi capa de servicio necesita una interfaz? Es todo en capas corectly? Necesito una capa de control también?

Gracias.

¿Fue útil?

Solución

Mi sugerencia:

para proyectos más grandes, utilice una capa DAO basado interfaz dedicada. No deje que su servicio de capa saber nada acerca de la tecnología subyacente persistencia. El uso de Hibernate / JPA / JDBC / JDO / lo que sea sólo en la capa DAO.

para proyectos más pequeños puede ser bien tener una capa de servicio única (especialmente dado el hecho de que tanto Session Hibernate y JPA EntityManager exponen comportamiento DAO estándar de la mayoría de la caja.

regla básica: si usted está haciendo un cambio de tecnología, asegúrese de que sólo necesita cambiar una capa de la aplicación

Actualización: esta es una interfaz muestra de DAO. Su capa de servicios haría único código en contra de esta interfaz y la implementación haría la sesión / entityManager / JDBC llamadas sin la capa de servicio de la necesidad de saber.

public interface CustomerDao extends CommonDao<Customer>{
    Customer getCustomerByEmail(String emailAddress);
    List<Customer> getCustomersWithinAgeRange(int lowerBound, int upperBound);
}

La clave:. En su capa de servicios, especifique sus dependencias basadas interfaz, es decir

private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao){
    this.customerDao = customerDao;
}

en lugar de

// this is horrible, it ties the service layer to implementation
// details of the dao layer
private HibernateCustomerDaoImpl customerDao;
public void setCustomerDao(HibernateCustomerDaoImpl customerDao){
    this.customerDao = customerDao;
}

Otros consejos

La DAO es el lugar para cualquier consulta específica de base de datos -. JDBC o Hibernate en su caso

El nivel de servicio está pensado para ofrecer una API para los consumidores como una capa de presentación o para otros. No habría ninguna razón para contaminar el nivel de servicio con características específicas de bases de datos. Su nivel de servicio podría tener lógica de negocio que está muy bien, pero no debe estar al tanto de la implementación subyacente DB OMI

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top